在C中使用布尔值

C没有任何内置的布尔类型。 在C中使用它们的最佳方式是什么?


选项1

typedef int bool;
#define true 1
#define false 0

选项2

typedef int bool;
enum { false, true };

选项3

typedef enum { false, true } bool;

备选案文4(C99)

#include <stdbool.h>

说明

  • 选项1,2和3在实践中将具有相同的行为。 #2和#3虽然没有使用#defines,在我看来这更好。
  • 选项4只有在使用C99的情况下才有效,这是实现它的“标准方式”。 如果可能,选择这个。
  • 如果你还没有决定,那就去#3吧!


    关于C语言中布尔值的一些想法:

    我足够老了,我只是使用plain int s作为我的布尔类型,没有任何typedefs或特殊的定义或枚举true / false值。 如果你按照我的建议不要与布尔常量进行比较,那么你只需要使用0/1来初始化标志。 然而,在这些近代,这种做法可能被认为是过于反动的。 在这种情况下,应该明确使用<stdbool.h>因为它至少具有标准化的好处。

    无论调用什么布尔常量,只能将它们用于初始化。 永远不要写类似的东西

    if (ready == TRUE) ...
    while (empty == FALSE) ...
    

    这些可以总是被更清楚的代替

    if (ready) ...
    while (!empty) ...
    

    请注意,这些实际上可以合理且可以理解地大声朗读。

    给你的布尔变量正面名称,即full而不是不notfull 。 后者导致难以阅读的代码。 比较

    if (full) ...
    if (!full) ...
    

    if (!notfull) ...
    if (notfull) ...
    

    前者一对自然地阅读,而!notfull虽然很难阅读,但在更复杂的布尔表达式中变得更糟。

    布尔参数通常应该避免。 考虑一个像这样定义的函数

    void foo(bool option) { ... }
    

    在函数的主体中,非常清楚这个参数的含义,因为它有一个方便且有希望的意义名称。 但是,通话网站看起来像

    foo(TRUE);
    foo(FALSE):
    

    在这里,根本不可能告诉参数意味着什么,而不总是查看函数定义或声明,并且如果添加更多布尔参数,它会变得更糟糕。我建议

    typedef enum { OPT_ON, OPT_OFF } foo_option;
    void foo(foo_option option);
    

    要么

    #define OPT_ON true
    #define OPT_OFF false
    void foo(bool option) { ... }
    

    无论哪种情况,呼叫站点现在看起来都像

    foo(OPT_ON);
    foo(OPT_OFF);
    

    读者至少有一个理解的机会,而不是疏浚foo的定义。


    C中的一个布尔值是一个整数:零代表假,非零代表真。

    另见布尔型数据类型,C,C ++,Objective-C,AWK。

    链接地址: http://www.djcxy.com/p/25139.html

    上一篇: Using boolean values in C

    下一篇: Boolean Field in Oracle