我认为关系运算符 == 在要检查的语句为 false 时返回 0,当语句为 true 时返回 1。但是,这不是我在一段代码中获得的输出。谁能解释一下?
我尝试在互联网上查找此内容,但到处都找到了我知道的相同解释。
int main()
{
int x=35;
printf("n%d %d %d",x==35,x=50,x>40);
return 0;
}
我预计输出为:1 50 1 但显示的输出是:0 50 0
在函数的参数中同时具有x == 35
和x = 50
的代码的行为不是由 C 标准定义的,因为它既修改x
又单独使用其值,并且 C 的规则没有说明哪个先发生。C 2018 6.5 2 说:
对象上的不同副作用或使用同一标量对象的值计算未排序,则行为是未定义的。
在x = 50
中,主值是 50,副作用是将存储在x
中的值更改为 50。
在x == 35
中,表达式是一个使用x
值的值计算。
通常,子表达式的计算是无序的,因为C 2018 6.5 3说:
除非稍后指定,否则子表达式的副作用和值计算是未排序的
C 2018 6.5.2.2 指定了函数调用发生的情况,并且没有指定计算参数的顺序。因此,上面引用的6.5 3适用。x = 50
和x == 35
是未排序的。因此,对x
既有副作用,又有未排序x
的值计算,因此 6.5 2 适用,并且行为不是由 C 标准定义的。
语句:
printf("n%d %d %d",x==35,x=50,x>40);
修改x
,以便(在本例中)执行测试x==35
时,x
等于 50。
函数参数的计算顺序未定义,因此在其他情况下,结果可能会有所不同。 应避免此类代码。 考虑:
printf( "n%d", x == 35 ) ;
printf( "%d", x = 50 ) ;
printf( "%d", x > 40 ) ;
这是明确定义的,将产生您期望的结果。
请注意,该语言将零和非零定义为分别表示假和真,而不是专门表示零和一。