C语言中布尔表达式的返回值
出于不值得一提的原因,我想知道布尔表达式是否有一个标准的定义值。例如C语言中布尔表达式的返回值,c,boolean,c99,c89,C,Boolean,C99,C89,出于不值得一提的原因,我想知道布尔表达式是否有一个标准的定义值。例如 int foo () { return (bar > 5); } 背景是,我担心我们的团队将TRUE定义为与1不同的东西,我担心有人可能会: if (foo() == TRUE) { /* do stuff */ } 我知道最好的选择是简单地去做 if (foo()) 但你永远不知道 布尔表达式是否有定义的标准值,还是由编译器决定?如果有,C99中是否包含标准值?C89呢?一个操作符,比如==,=、&&和|
int foo () {
return (bar > 5);
}
背景是,我担心我们的团队将TRUE定义为与1不同的东西,我担心有人可能会:
if (foo() == TRUE) { /* do stuff */ }
我知道最好的选择是简单地去做
if (foo())
但你永远不知道
布尔表达式是否有定义的标准值,还是由编译器决定?如果有,C99中是否包含标准值?C89呢?一个操作符,比如
==
,=产生布尔值的code>、&&
和| |
将计算为表达式中的1为真,如果表达式为假,则计算为0。此表达式的类型为int
因此,如果TRUE
宏未定义为1
,则上述比较将失败
在布尔上下文中计算表达式时,0的计算结果为false,非零的计算结果为true。因此,为了安全起见,TRUE
应定义为:
#define TRUE (!0)
正如评论中提到的,如果您的编译器符合C99,则可以#包括并使用true
和false
根据:
6.5.3.3(一元算术运算符)
逻辑求反运算符的结果如果
其操作数的值比较不等于0,如果其
操作数比较等于0。结果的类型为int
。这个
表达式!E
相当于(0==E)
6.5.8(关系运算符)
每个运算符
(大于),=
(大于或等于)
如果指定的关系为真,则应产生1,如果为假,则产生0。
结果的类型为int
6.5.9(相等运算符)
==
(等于)和=代码>(不等于)运算符为
与关系运算符类似,除了其较低的
优先。如果指定了
关系为true,如果为false,则为0。结果具有类型
int
6.5.13(逻辑与运算符)
如果两个操作数比较,&&
运算符应产生1
不等于0;否则,结果为0。结果的类型为int
6.5.14(逻辑或运算符)
如果对其任一操作数进行比较,|
运算符应产生1
不等于0;否则,结果为0。结果的类型为int
C
编程语言没有定义布尔值。传统上,C
编程语言使用integer
类型来表示布尔数据类型
C中的布尔值:
0 = false`
Any other value = true`
通常人们会使用1
表示真实
C99引入了\u Bool
数据类型,该数据类型在其他C
衍生产品中不可用。请参阅维基百科链接。此外,出于兼容性原因,添加了一个新的头文件stdbool.h
。此标题允许程序员以与C++
语言相同的方式使用boolean
类型
要在C
中使用bool
,我们可以使用enum
,如下所示
enum bool {
false, true
};
bool value;
value = bool(0); // False
value = bool(1); // True
if(value == false)
printf("Value is false");
else
printf("Value is true");
另外,还有相关的堆栈溢出问题
自C99以来,在标准标题stdbool.h
中定义了一个标准类型bool
,其中包含常量true
和false
。要完成Eugene所说的内容,您可能会对以下链接感兴趣:谢谢。事实上,我正在寻找有争议的事实,1)更改TRUE的定义,2)使用兼容C99的编译器(现在,我们使用兼容C89的编译器),谢谢。我早就料到了。但我不确定它是否按标准计算为1,或者这是否是一个问题-specific@JACH添加了C99中关于布尔表达式的附加注释。详细信息:结果类型为int
,其中==,!=,&&&,| |,!,>,>=,谢谢你提供的信息。因此它在C99中定义。似乎C89信息很难获得,或者根本不存在。我想换成C99的另一个原因是。我想你可以把“为了安全起见,TRUE应该定义为:#define TRUE(!0)
”的措辞改成类似于“如果你记不起C中TRUE的值是什么(它是1),你可以使用#define TRUE(!0)
”的措辞,因为我看到有高代表性的人建议!0
并不总是1。感谢您提供的链接,非常有用。不过,我的问题更多地与布尔运算的结果有关,因为我们在内部使用的伪布尔类型已经是TRUE或FALSE。这并不能回答问题。在C中使用enum
作为布尔类型是一个非常糟糕的主意!