c - C 中挑剔的 bool 值

标签 c language-lawyer c89

我正在阅读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 将是被认为是真整数。

您可以提出合理的论点,认为此类警告毫无用处,但其他人也可以提出同样合理的论点,认为此类警告确实有用。在常见代码中它会出现许多误报,但如果以避免此类警告的方式编写代码,则可能会使代码更具可读性。

同时,此类定义对于不跟踪此问题的其他编译器来说是无害的,因为它们只会看到计算结果为 10 的常量表达式。

关于c - C 中挑剔的 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28579943/

相关文章:

c - 在 GNU 系统中使用 printf 打印 size_t

c - 如何使 valgrind 准确重现错误?

c - Nginx 模块用于从 MongoDB 的 Make 错误中提供文件

c++ - 从没有 sprintf() 或模数的整数中提取数字

c - 为什么转换 'out of range integer to integer' 会导致 IB,但转换 'out of range floating-point to integer' 会导致 UB?

c - Linux 内核的 __is_constexpr 宏

c - 为什么这个 C 语言字符计数程序将字符的值加倍?

c++ - C++ 标准库中是否有保证不执行动态内存分配的函数或类?

c - 符合 ANSI C 标准的平台,其中全零位不是空指针表示

c - C89 标准中的哪一部分允许 "implicit int"规则?