C没有任何内置布尔类型。在C语言中使用它们的最佳方式是什么?
当前回答
如果条件表达式为非零,则认为它们为真,但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支持布尔类型,但需要#include<stdbool.h>。
例子:
#include <stdbool.h>
int main()
{
bool arr[2] = {true, false};
printf("%d\n", arr[0] && arr[1]);
printf("%d\n", arr[0] || arr[1]);
return 0;
}
输出:
0
1
如果您使用的是C99编译器,它内置了对布尔类型的支持:
#include <stdbool.h>
int main()
{
bool b = false;
b = true;
}
http://en.wikipedia.org/wiki/Boolean_data_type
C有一个布尔类型:bool(至少在过去10(!)年)
包括stdbool.h和true/false将按预期工作。
C中的布尔值是一个整数:假为零,真为非零。
另请参见布尔数据类型,C节,C++,Objective-C,AWK。
如果允许您使用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位可用的类型字符那样。