C 中布尔表达式的返回值

JAC*_*ACH 2 c boolean c99 c89

由于不值得一提的原因,我想知道布尔表达式是否有标准定义值。例如

int foo () {
    return (bar > 5);
}
Run Code Online (Sandbox Code Playgroud)

背景是我担心我们的团队将 TRUE 定义为与 1 不同的东西,并且我担心有人可能会这样做:

if (foo() == TRUE) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)

我知道最好的选择就是简单地做

if (foo())
Run Code Online (Sandbox Code Playgroud)

但你永远不知道。

布尔表达式是否有定义的标准值或者由编译器决定?如果有的话,标准值是否包含在C99中?C89呢?

dbu*_*ush 6

诸如==!=&&、 和 之类的运算符||会生成布尔值,如果表达式为真,则计算结果为 1;如果表达式为假,则计算结果为 0。这个表达的类型是int.

所以如果TRUE宏没有定义为1,则上述比较将失败。

当在布尔上下文中计算表达式时,0 计算结果为 false,非零计算结果为 true。所以为了安全起见,TRUE应该定义为:

#define TRUE (!0)
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的,如果您的编译器兼容 C99,您可以#include <stdbool.h>使用trueand false

根据C99

6.5.3.3(一元算术运算符)

如果逻辑非运算符的操作!数的值比较不等于 0,则结​​果为 0;如果其操作数的值比较等于 0,则逻辑非运算符的结果为 1。结果的类型为int。该表达式 !E相当于(0==E).

6.5.8(关系运算符)

如果指定关系为真,则每个运算符<(小于)、>(大于)、<= (小于或等于)和>=(大于或等于)应产生 1,如果指定关系为假,则应产生 0。结果的类型为int

6.5.9(相等运算符)

==(等于)和!=(不等于)运算符与关系运算符类似,只是它们的优先级较低。如果指定的关系为 true,则每个运算符生成 1;如果指定的关系为 false,则每个运算符生成 0。结果的类型为 int

6.5.13(逻辑与运算符)

&&如果两个操作数比较不等于 0,则该运算符应产生 1;否则,它产生 0。结果的类型为int

6.5.14(逻辑或运算符)

||如果任一操作数不等于 0,则该运算符应产生 1;否则,它产生 0。结果的类型为int