在C中使用true和false

时间:2010-02-12 18:15:10

标签: c coding-style

据我所知,有三种方法可以在c

中使用布尔值
  1. 使用bool类型,然后使用true和false
  2. 使用预处理器#define FALSE 0 ... #define TRUE !(FALSE)
  3. 进行定义
  4. 只是直接使用常数,即1和0
  5. 我错过了其他方法吗?不同方法的优缺点是什么?

    我认为最快的是3号,2号更容易读取(尽管按位否定会略微增加开销),1最易读与所有编译器不兼容。

15 个答案:

答案 0 :(得分:92)

如果您的系统提供,请包含<stdbool.h>。这定义了许多宏,包括boolfalsetrue(分别定义为_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)

我不了解你的具体情况。回到编写C程序时,我们总是使用#2。

#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