C没有任何内置布尔类型。在C语言中使用它们的最佳方式是什么?


当前回答

如果您使用的是C99编译器,它内置了对布尔类型的支持:

#include <stdbool.h>
int main()
{
  bool b = false;
  b = true;
}

http://en.wikipedia.org/wiki/Boolean_data_type

其他回答

您可以使用一个字符或另一个小数字容器。

伪码

#define TRUE  1
#define FALSE 0

char bValue = TRUE;
typedef enum {
    false = 0,
    true
} t_bool;

这就是:

#define TRUE 1
#define FALSE 0

第一件事。C、 即ISO/IEC 9899已经有19年的布尔型了。这比访问这个问题时,业余/学术/专业部分的C编程生涯的预期长度要长得多。我的确实超过了这一点,可能只有1-2年。这意味着,在一个普通读者完全了解C的过程中,C实际上拥有布尔数据类型。

对于数据类型,#include<stdbool.h>,并使用true、false和bool。或者不包括它,而是使用_Bool、1和0。


在本主题的其他答案中,有各种危险的做法。我将向他们讲话:

typedef int bool;
#define true 1
#define false 0

这是不可能的,因为一个偶然的读者——在那19年里学习过C语言——会认为bool是指实际的bool数据类型,并且会有类似的行为,但事实并非如此!例如

double a = ...;
bool b = a;

对于C99 bool/_bool,如果a为零,b将设置为false,否则为true。C11 6.3.1.2p1

当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果为1。59)脚注59)NaN不等于0,因此转换为1。

在typedef就位的情况下,double将被强制为int-如果double的值不在int的范围内,则行为未定义。

当然,如果在枚举中声明了true和false,这同样适用。

更危险的是宣布

typedef enum bool {
    false, true
} bool;

因为现在除了1和0之外的所有值都是无效的,如果将这样的值分配给该类型的变量,则行为将完全未定义。

因此,如果有某种莫名其妙的原因,如果您不能使用C99,则应使用布尔变量:

按原样键入int和值0和1;并小心地将域从任何其他值转换为带有双重否定的值!!或者如果你坚持认为你不记得0是假的和非零真的,那么至少使用大写,这样他们就不会与C99的概念混淆:BOOL、TRUE和FALSE!

如果允许您使用C99,这只是对其他答案的补充和一些澄清。

+-------+----------------+-------------------------+--------------------+
|  Name | Characteristic | Dependence in stdbool.h |        Value       |
+-------+----------------+-------------------------+--------------------+
| _Bool |   Native type  |    Don't need header    |                    |
+-------+----------------+-------------------------+--------------------+
|  bool |      Macro     |           Yes           | Translate to _Bool |
+-------+----------------+-------------------------+--------------------+
|  true |      Macro     |           Yes           |   Translate to 1   |
+-------+----------------+-------------------------+--------------------+
| false |      Macro     |           Yes           |   Translate to 0   |
+-------+----------------+-------------------------+--------------------+

我的一些偏好:

_布尔还是布尔?两者都很好,但bool看起来比关键字_bool更好。bool和_bool的接受值为:false或true。指定0或1而不是false或true是有效的,但更难阅读和理解逻辑流。

标准中的一些信息:

_Bool不是无符号整数,而是无符号整数类型组的一部分。它足够大,可以保存值0或1。不要,但是的,你可以重新定义bool true和false,但肯定不是个好主意。这种能力被认为是过时的,将来将被删除。将标量类型(算术类型和指针类型)赋给_Bool或Bool,如果标量值等于0或与0比较,则为0,否则结果为1:_Bool x=9;当分配给x时,9被转换为1。_Bool是1字节(8位),通常程序员会尝试使用其他位,但不建议使用,因为唯一的保证是只使用一位来存储数据,而不是像具有8位可用的类型字符那样。