关于编码风格:在C中使用true和false

Using true and false in C

据我所知,在C语言中使用布尔值有三种方法

  • 对于bool类型,从那时起使用true和false
  • 使用预处理器#define FALSE 0 ... #define TRUE !(FALSE)定义
  • 直接使用常量,即1和0
  • 还有其他我错过的方法吗?不同方法的优缺点是什么?

    我想速度最快的应该是数字3,2仍然更容易阅读(尽管位否定会稍微增加开销),1是最容易阅读的,与所有编译器不兼容。


    如果您的系统提供,只需包含。它定义了许多宏,包括boolfalsetrue(分别定义为_Bool、0和1)。详见C99第7.16节。


    在代码中直接使用0或1。

    对于C程序员来说,这和判断对错一样直观。


    我通常做A:

    1
    typedef enum {FALSE = 0, TRUE} boolean;


    无论你选择哪一个,都要将你的变量与错误或错误进行比较。

    从历史上看,在C或C++中比较任何事物与真(1)是不好的。只有错误才保证为零(0)。真是任何其他值。nbsp;许多编译器供应商在它们的头文件中的某个地方有这些定义。nbsp;

    定义真1定义假0

    这使太多人沿着花园小路走。nbsp;除chartype外,许多库函数在成功时返回不等于1的非零值。有很多具有相同行为的遗留代码。


    对于stdbool.h定义的bool类型,当需要将代码从支持bool类型的较新编译器移动到较旧编译器时,会出现问题。当您使用基于旧版本规范的C编译器移动到新的体系结构时,这可能发生在嵌入式编程环境中。

    总之,当可移植性很重要时,我会坚持使用宏。否则,执行其他人推荐的操作,并在类型中使用bulit。


    您可以用测试bool是否在c99 stdbool.h中定义

    1
    2
    3
    #ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
    //typedef or define here
    #endif


    除0以外的任何int都是真的;false是零。这样的代码可以继续按预期工作:

    1
    2
    3
    4
    5
    6
    7
    int done = 0;   // `int` could be `bool` just as well

    while (!done)
    {
         // ...
         done = OS_SUCCESS_CODE == some_system_call ();
    }

    在我看来,bool是一种被高估的类型,可能是来自其他语言的遗留物。int作为布尔类型工作得很好。


    我更喜欢(1)在定义变量时,但在表达式中,我从不将其与真和假进行比较,只需采用if(flag)或if(if)的隐式C定义!flag)或if(ptr)。这是做事情的方法。


    我要1分。我没有遇到与它不相容的情况,这更自然。但是,我认为它是C++的一部分,而不是C标准。我认为通过使用defines或第三个选项进行肮脏的黑客攻击不会获得任何性能,但只会带来维护代码的痛苦。


    我更喜欢第三种解决方案,即使用1和0,因为当必须测试条件是真是假时,它特别有用:您可以简单地为if参数使用变量。
    如果您使用其他方法,我认为为了与代码的其余部分保持一致,我应该使用这样的测试:

    1
    2
    3
    4
    if (variable == TRUE)
    {
       ...
    }

    而不是:

    1
    2
    3
    4
    if (variable)
    {
       ...
    }

    1 is most readable not compatible with all compilers.

    没有一个iso c编译器具有名为bool的内置类型。iso c99编译器有一个_Bool类型和一个typedef的bool类型的头。所以兼容性只是在编译器不兼容C99的情况下提供自己的头文件(例如VC++)。

    当然,更简单的方法是编译你的C代码作为C++。


    没有真正的速度差。它们对编译器来说是完全相同的。区别在于人类试图使用和阅读你的代码。

    对我来说,使BoL、true和false成为C++代码中的最佳选择。在C代码中,有一些编译器不支持bool(我经常不得不使用旧系统),因此在某些情况下,我可能会使用定义。


    我更喜欢使用

    1
    2
    #define FALSE (0!=0)
    #define TRUE  (0==0)

    或者直接在代码中

    1
    if (flag == (0==0)) { ... }

    编译器会处理这个问题。我使用了很多语言,必须记住,false是0让我很困扰;但是如果必须这样做,我通常会想到字符串循环。

    1
    do { ... } while (*ptr);

    这让我发现错误是0


    我不知道你的具体情况。当我写C程序的时候,我们总是使用2。

    1
    2
    #define FALSE = 0
    #define TRUE = !FALSE

    这可能是在外星平台下的DOS或基于Intel的处理器。但我曾经同时使用C和ASM编写图形库和图形化IDE。我是Michael Abrash的忠实粉丝,我打算学习纹理映射等。不管怎样!这不是问题的主题!

    这是在C中定义布尔值最常用的形式,因为这个headerfile stdbool.h当时不存在。


    我以前使用define是因为它们使代码更容易阅读,而且与使用数字(0,1)相比,性能不应该下降,因为预处理器在编译前将define转换为数字。一旦应用程序运行,预处理器就不会再次出现,因为代码已经编译。

    顺便说一句,应该是:

    1
    2
    #define FALSE 0
    #define TRUE 1

    记住-1,-2,…2、3等。所有的计算结果都为真。