在C中使用布尔值

C没有任何内置的布尔types。 在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时才有效,这是“标准方式”。 如果可能,select这个。

如果你还没有决定,那就去#3吧!

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

我已经够老了,我只是使用plain int s作为我的布尔types,没有任何typedefs或特殊的定义或枚举true / false值。 如果你按照我的build议,永远不要与布尔常量进行比较,那么你只需要使用0/1来初始化标志。 但是,这种方法在现代也许被认为是过于反动的。 在这种情况下,一定要使用<stdbool.h>因为它至less具有标准化的好处。

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

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

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

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

请注意,这些可以合理而可以理解地大声读出来。

给你的布尔variables积极的名字,即full而不是不notfull 。 后者导致难以阅读的代码。 比较

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

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

前一对都是自然读取的,而!notfull虽然很难读取,但在更复杂的布尔expression式中变得更糟。

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

 void foo(bool option) { ... } 

在这个函数的主体之中,由于它有一个方便的,有希望的有意义的名字,所以这个论证是非常清楚的。 但是,通话网站是这样的

 foo(TRUE); foo(FALSE): 

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

 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); 

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

C中的布尔值是一个整数:false表示为零,非为零。

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

这是我使用的版本:

 typedef enum { false = 0, true = !false } bool; 

因为false只有一个值,但是逻辑true可以有很多值,但是技术设置为编译器将使用的与false相反的东西。

这照顾到某人编码的问题,这可能归结为这个问题:

 if (true == !false) 

我认为我们都会同意这不是一个好的做法,但是为了“真假”的一次性成本,我们消除了这个问题。

[编辑]最后我用:

 typedef enum { myfalse = 0, mytrue = !myfalse } mybool; 

避免与其他定义truescheme发生名称冲突。 但是这个概念还是一样的。

[编辑]显示整数转换为布尔值:

 mybool somebool; int someint = 5; somebool = !!someint; 

第一个(最右)! 将非零整数转换为0,然后第二个(最左边)! 将0转换为myfalse值。 我将把它作为读者的练习来转换一个零整数。

如果您使用的是C99编译器,则它具有对booltypes的内置支持:

 #include <stdbool.h> int main() { bool b = false; b = true; } 

http://en.wikipedia.org/wiki/Boolean_data_type

 typedef enum { false = 0, true } t_bool; 

C有一个布尔types: bool (至less在过去10(!)年)

包括stdbool.h和true / false将按预期工作。

任何非零值在布尔操作中被评估为真,所以你可以

 #define TRUE 1 #define FALSE 0 

并使用常量。

@Thomas Matthews:条件expression式被认为是非真的,但是C标准要求逻辑运算符本身返回0或1。

@Tom:#define TRUE!FALSE不好,完全没有意义。 如果头文件进入编译的C ++代码,那么它可能会导致问题:

 void foo(bool flag); ... int flag = TRUE; foo(flag); 

有些编译器会产生关于int => bool转换的警告。 有时候人们通过这样做来避免

 foo(flag == TRUE); 

强制expression式是一个C ++布尔。 但是如果你#define TRUE!FALSE,你最终会得到:

 foo(flag == !0); 

最终做一个int-to-bool的比较,可以触发警告。

你可以简单地使用#define指令,如下所示:

 #define TRUE 1 #define FALSE 0 #define NOT(arg) (arg == TRUE)? FALSE : TRUE typedef int bool; 

并使用如下:

 bool isVisible = FALSE; bool isWorking = TRUE; isVisible = NOT(isVisible); 

等等

您可以使用一个字符,或另一个小号码容器。

Pseduo

 #define TRUE 1 #define FALSE 0 char bValue = TRUE; 

这是:

 #define TRUE 1 #define FALSE 0