由于不值得一提的原因,我想知道布尔表达式是否有标准定义值。例如
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呢?
诸如==、!=、&&、 和 之类的运算符||会生成布尔值,如果表达式为真,则计算结果为 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。