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


当前回答

如果您使用的是C99编译器,它内置了对布尔类型的支持:

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

您可以简单地使用#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);

等等

如果条件表达式为非零,则认为它们为真,但C标准要求逻辑运算符本身返回0或1。

@汤姆:#定义正确!FALSE是糟糕的,完全没有意义。如果头文件进入编译的C++代码,那么它可能会导致问题:

void foo(bool flag);

...

int flag = TRUE;
foo(flag);

某些编译器会生成关于int=>bool转换的警告。有时人们会通过以下方式避免这种情况:

foo(flag == TRUE);

以强制表达式为C++布尔值。但如果你#定义TRUE!如果为FALSE,则结果为:

foo(flag == !0);

它最终会进行int到bool的比较,这无论如何都会触发警告。

关于C中布尔值的几点思考:

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

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

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

这些总是可以被更清晰的

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

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

给布尔变量取正名,即full而不是notfull。后者导致代码难以容易阅读。比较

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

with

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

or

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

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

foo(OPT_ON);
foo(OPT_OFF);

读者至少有机会在不理解foo定义的情况下理解它。

在布尔运算中,任何非零的值都被计算为真,因此您可以

#define TRUE 1
#define FALSE 0

并使用常数。