协慌网

登录 贡献 社区

在 C 中使用布尔值

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

答案

从好到坏:

选项 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 仅在使用 C99(或更新版本)时才有效,这是 “标准方式”。如果可能,请选择此选项。
  • 实际上,选项 2、3 和 4 具有相同的行为。 #2 和#3 虽然不使用 #defines,但我认为更好。

如果您不确定,请选择#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 表示为非零。

另请参见布尔数据类型,第C,C ++,Objective-C,AWK 节