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
将被视为真整数。
您可以合理地论证此类警告毫无用处,但其他人也可以合理地论证此类警告确实有用。它在普通代码中会有很多误报,但如果以一种避免此类警告的方式编写,它可能会使代码更具可读性。
同时,这样的定义对于其他不跟踪它的编译器是无害的,因为它们只会看到计算结果为 1
和 0
.
的常量表达式
我正在阅读 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
将被视为真整数。
您可以合理地论证此类警告毫无用处,但其他人也可以合理地论证此类警告确实有用。它在普通代码中会有很多误报,但如果以一种避免此类警告的方式编写,它可能会使代码更具可读性。
同时,这样的定义对于其他不跟踪它的编译器是无害的,因为它们只会看到计算结果为 1
和 0
.