据我所知,有三种方法可以在c
中使用布尔值#define FALSE 0 ... #define TRUE !(FALSE)
我错过了其他方法吗?不同方法的优缺点是什么?
我认为最快的是3号,2号更容易读取(尽管按位否定会略微增加开销),1最易读与所有编译器不兼容。
答案 0 :(得分:92)
如果您的系统提供,请包含<stdbool.h>
。这定义了许多宏,包括bool
,false
和true
(分别定义为_Bool
,0和1)。有关详细信息,请参阅C99的第7.16节。
答案 1 :(得分:18)
直接在代码中使用0或1。
对于C程序员来说,这就像真或假一样直观。
答案 2 :(得分:14)
我经常做一个:
typedef enum {FALSE = 0, TRUE} boolean;
答案 3 :(得分:4)
使用stdbool.h定义bool类型时,如果需要将代码从支持bool类型的较新编译器移动到较旧的编译器,则会出现问题。当您使用基于旧版规范的C编译器迁移到新架构时,这可能发生在嵌入式编程环境中。
总之,当可移植性很重要时,我会坚持使用宏。否则,按照其他人的建议做,并使用类型的bulit。
答案 4 :(得分:4)
无论你使用哪三种,都要将你的变量与FALSE进行比较,或者将其比较为假。
历史上,在c或c ++中将任何与true(1)进行比较是一个坏主意。只保证false为零(0)。 True是任何其他值。 许多编译器供应商在其标题中的某处具有这些定义。
#define TRUE 1
#define FALSE 0
这导致太多人走上花园小径。 除了chartype之外,许多库函数在成功时返回非零值不等于1。存在大量具有相同行为的遗留代码。
答案 5 :(得分:3)
您可以测试是否在c99 stdbool.h中使用
定义了bool#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif
答案 6 :(得分:2)
我会选择1.我没有遇到与它的不兼容,更自然。但是,我认为它是C ++的一部分而不是C标准。 我认为对于使用定义或第三种选择进行肮脏的黑客攻击 - 不会获得任何性能,但只能维护代码。
答案 7 :(得分:2)
我更喜欢(1)当我定义一个变量但是在表达式中我从不与true和false进行比较时只需采用if(flag)或if(!flag)或if(ptr)的隐式C定义。这就是做事的C方式。
答案 8 :(得分:2)
除零以外的任何int都为真; false为零。这样的代码继续按预期工作:
int done = 0; // `int` could be `bool` just as well
while (!done)
{
// ...
done = OS_SUCCESS_CODE == some_system_call ();
}
IMO,bool
是一种被高估的类型,也许是其他语言的结转。 int
可以作为布尔类型使用。
答案 9 :(得分:1)
没有真正的速度差异。它们与编译器完全相同。不同之处在于人类试图使用和阅读您的代码。
对我来说,使bool,true和false成为C ++代码中的最佳选择。在C代码中,有些编译器不支持bool(我经常需要使用旧系统),所以在某些情况下我可能会使用定义。
答案 10 :(得分:1)
1最易读,与所有编译器不兼容。
没有ISO C编译器具有称为bool
的内置类型。 ISO C99编译器的类型为_Bool
,标头为typedef的bool
。因此,如果编译器不符合C99(例如VC ++),那么兼容性就是提供自己的头的情况。
当然,更简单的方法是将C代码编译为C ++。
答案 11 :(得分:1)
我更喜欢第三种解决方案,即使用1和0,因为当你必须测试一个条件是真还是假时它特别有用:你可以简单地使用一个变量作为if参数。
如果你使用其他方法,我认为,为了与代码的其余部分保持一致,我应该使用这样的测试:
if (variable == TRUE)
{
...
}
而不是:
if (variable)
{
...
}
答案 12 :(得分:0)
我以前使用#define是因为它们使代码更容易阅读,并且与使用数字(0,1)相比,应该没有性能下降因为预处理器在编译之前将#define转换为数字。一旦运行应用程序,预处理器就不会再次出现,因为代码已经编译好了。
它应该是:#define FALSE 0
#define TRUE 1
并记住-1,-2,...... 2,3等等都评估为真。
答案 13 :(得分:0)
#define FALSE = 0
#define TRUE = !FALSE
这可能是在DOS或基于Intel的处理器的外来平台下。但我曾经同时使用C和ASM编写图形库和图形IDE。我是Micheal Abrash的真正粉丝,并打算学习纹理映射等等。无论如何!这不是问题的主题!
这是在C中定义布尔值的最常用形式,因为此头文件stdbool.h当时不存在。
答案 14 :(得分:0)
我更喜欢使用
#define FALSE (0!=0)
#define TRUE (0==0)
或直接在代码中
if (flag == (0==0)) { ... }
编译器会处理。我使用多种语言,并且必须记住FALSE为0困扰着我很多。但是如果需要,我通常会考虑该字符串循环
do { ... } while (*ptr);
这使我看到FALSE为0