C语言布尔表达式返回值

时间:2014-03-18 19:47:03

标签: c boolean-expression

C语言没有布尔数据类型,而是使用整数。对照 运算符如==和< =返回整数值0表示false,1表示true表示。但是,C中的if语句会将其条件的任何非零值视为等于true。为什么不同?为什么不允许关系运算符返回任何非零值来表示true?

3 个答案:

答案 0 :(得分:3)

如果条件表达式可以返回true的任何非零值,则在将其存储到太小的变量时可能会遇到麻烦,在极端情况下是一位的位域。

struct foo { unsigned int bar: 1; } baz;
baz.bar = 1 == 1;

如果1 == 1条件返回2(或任何偶数),则会遇到麻烦,因为baz.bar将结束0,在布尔上下文中评估为false。

答案 1 :(得分:1)

当你在条件中使用关系运算符时,编译器会将其编译为“jump if greater”或类似运算符,并且不会真正计算<=表达式的返回值。表达式始终返回0或1并不重要,因为该值实际上从未计算过。

关系运算符返回0或1的唯一时间是重要的是它们的值在更大的表达式中使用,例如算术或赋值给变量。这比在分支中直接使用它们的情况要少得多,并且总是返回1的便利性并不是很昂贵。

答案 2 :(得分:0)

在C中,0是假的,无论它是来自比较运算符的返回类型还是if语句,或者您要检查的任何内容。但是,虽然if()语句将接受true为非零的任何内容,但比较运算符必须只返回一个对象,因此确定该对象为“1”。这是你回来还是接受的区别。

就像在任何其他功能中一样,比如说int foo(int x){},您可以接受 x的任何值,但在离开函数之前,您必须实际选择要返回的内容。我想你可以返回一个随机数,但那会有什么好处呢?取而代之的是“1”。