从好到坏:
选项 1(C99 及更高版本)
#include <stdbool.h>
选项 2
typedef enum { false, true } bool;
选项 3
typedef int bool;
enum { false, true };
选项 4
typedef int bool;
#define true 1
#define false 0
#解释
如果您不确定,请选择#1!
关于 C 语言中布尔值的几点思考:
我已经够大了,我只使用 Plain int
作为我的布尔类型,而没有任何类型定义或特殊的定义或枚举来表示 true / false 值。如果您遵循以下关于永远不要与布尔常量进行比较的建议,那么无论如何您只需要使用 0/1 来初始化标志。但是,在现代,这种方法可能被认为太反动了。在那种情况下,绝对应该使用<stdbool.h>
因为它至少具有被标准化的好处。
无论调用什么布尔常量,都只能将它们用于初始化。从来没有写过类似的东西
if (ready == TRUE) ...
while (empty == FALSE) ...
这些总是可以用更清晰的代替
if (ready) ...
while (!empty) ...
请注意,这些实际上可以合理且可以理解地大声读出。
给您的布尔变量notfull
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 中的布尔值是一个整数:false 表示为零,true 表示为非零。