我正在阅读comp.lang.c bool 值的描述,C99 之前的版本。它提到有些人更喜欢将自己的 bool 值定义为:
#define TRUE (1==1)
#define FALSE (!TRUE)
但是,标准定义相等运算符在两个值比较相等时始终返回值为 1 的有符号 int (C11 - 6.5.9),并且逻辑非运算符应返回值为 0 的 int(如果值比较不等于 0 (C11 - 6.5.3.3)。
如果是这种情况并且上述定义使用文字,则评估不会在编译时发生并且生成的定义是:
#define TRUE (1)
#define FALSE (0)
还有一个后续问题。是否存在将 true 和 false 标签分别定义为除 1 和 0 之外的任何内容都有意义的情况?
请原谅,当我的问题涉及 C89 时,我引用了 C11,但我手头只有 C11 标准。
最佳答案
(1==1)
和 (!TRUE)
在某些编译器上是有用的定义(我没有具体的例子) 跟踪整数是否来自 bool 比较。这使他们能够发出警告
if (i)
同时不警告
if (i != 0)
并且也不警告
j = i != 0;
if (j)
即使在所有三种情况下,条件都是非常量 int
。
这样,就不会为 int b = TRUE;
...if (b)
生成警告,因为 b
将是被认为是真整数。
您可以提出合理的论点,认为此类警告毫无用处,但其他人也可以提出同样合理的论点,认为此类警告确实有用。在常见代码中它会出现许多误报,但如果以避免此类警告的方式编写代码,则可能会使代码更具可读性。
同时,此类定义对于不跟踪此问题的其他编译器来说是无害的,因为它们只会看到计算结果为 1
和 0
的常量表达式。
关于c - C 中挑剔的 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28579943/