我正在阅读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标准。
答案 0 :(得分:3)
(1==1)
和(!TRUE)
是一些编译器上的有用定义(我没有一个具体的例子),它跟踪一个整数来自布尔比较。这使他们能够警告
if (i)
同时没有警告
if (i != 0)
并且没有警告
j = i != 0;
if (j)
即使在所有三种情况下,条件都是非常数int
。
这样,就不会为int b = TRUE;
... if (b)
生成警告,因为b
将被视为真值整数。
你可以提出一个合理的论点,即这样的警告毫无用处,但是其他人可以做出同样合理的论据,这些警告确实有用。它在公共代码中会有许多误报,但如果以避免此类警告的方式编写代码,它可能会使代码更具可读性。
同时,这些定义对于不跟踪此问题的其他编译器是无害的,因为他们只看到评估为1
和0
的常量表达式。