在C中挑选布尔值

时间:2015-02-18 09:24:44

标签: c language-lawyer c89

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

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

但是,标准定义了相等运算符,当两个值比较相等(C11 - 6.5.9)时,总是返回值为1的signed int,而逻辑非运算符应返回值为0的int,如果值比较不等于0(C11 - 6.5.3.3)。

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

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

还有一个后续问题。是否有任何理由将真假标签分别定义为1和0以外的任何东西?

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

1 个答案:

答案 0 :(得分:3)

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

if (i)

同时没有警告

if (i != 0)

并且没有警告

j = i != 0;
if (j)

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

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

你可以提出一个合理的论点,即这样的警告毫无用处,但是其他人可以做出同样合理的论据,这些警告确实有用。它在公共代码中会有许多误报,但如果以避免此类警告的方式编写代码,它可能会使代码更具可读性。

同时,这些定义对于不跟踪此问题的其他编译器是无害的,因为他们只看到评估为10的常量表达式。