关系运算符 == 在 C 中如何工作?



我认为关系运算符 == 在要检查的语句为 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 == 35x = 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 = 50x == 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 ) ;

这是明确定义的,将产生您期望的结果。

请注意,该语言将零和非零定义为分别表示假和真,而不是专门表示和一。

相关内容

  • 没有找到相关文章

最新更新