C没有任何内置布尔类型。在C语言中使用它们的最佳方式是什么?
当前回答
C有一个布尔类型:bool(至少在过去10(!)年)
包括stdbool.h和true/false将按预期工作。
其他回答
在布尔运算中,任何非零的值都被计算为真,因此您可以
#define TRUE 1
#define FALSE 0
并使用常数。
这就是:
#define TRUE 1
#define FALSE 0
typedef enum {
false = 0,
true
} t_bool;
如果条件表达式为非零,则认为它们为真,但C标准要求逻辑运算符本身返回0或1。
@汤姆:#定义正确!FALSE是糟糕的,完全没有意义。如果头文件进入编译的C++代码,那么它可能会导致问题:
void foo(bool flag);
...
int flag = TRUE;
foo(flag);
某些编译器会生成关于int=>bool转换的警告。有时人们会通过以下方式避免这种情况:
foo(flag == TRUE);
以强制表达式为C++布尔值。但如果你#定义TRUE!如果为FALSE,则结果为:
foo(flag == !0);
它最终会进行int到bool的比较,这无论如何都会触发警告。
如果允许您使用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位可用的类型字符那样。