C 中的挑剔布尔值

Nitpicking booleans in C

我正在阅读 comp.lang.c 对布尔值的描述,C99 之前的版本。它提到有些人更喜欢将自己的布尔值定义为:

#define TRUE (1==1)
#define FALSE (!TRUE)

但是,标准将相等运算符定义为在两个值比较相等时始终 return 值为 1 的有符号整数 (C11 - 6.5.9),并且逻辑非运算符应 return 如果值比较不等于 0,则值为 0 的 int (C11 - 6.5.3.3)。

如果是这种情况并且上面的定义使用文字,则评估不会在编译时发生并且生成的定义是:

#define TRUE (1)
#define FALSE (0)

还有一个后续问题。在任何情况下,将真标签和假标签分别定义为 1 和 0 以外的任何值是否有意义?

请原谅,当我的问题涉及 C89 时我引用了 C11,但我手头只有 C11 标准。

(1==1)(!TRUE) 是一些编译器的有用定义(我没有一个具体的例子),它们跟踪整数是否来自布尔比较。这使他们能够警告

if (i)

同时不警告

if (i != 0)

并且也不对

发出警告
j = i != 0;
if (j)

即使在所有三种情况下,条件都是非常数 int

这样,不会为 int b = TRUE;...if (b) 生成警告,因为 b 将被视为真整数。

您可以合理地论证此类警告毫无用处,但其他人也可以合理地论证此类警告确实有用。它在普通代码中会有很多误报,但如果以一种避免此类警告的方式编写,它可能会使代码更具可读性。

同时,这样的定义对于其他不跟踪它的编译器是无害的,因为它们只会看到计算结果为 10.

的常量表达式