我认为关系运算符 == 当要检查的语句为假时返回 0,当它为真时返回 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
我认为关系运算符 == 当要检查的语句为假时返回 0,当它为真时返回 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
C 标准没有定义函数参数中包含和的代码的行为x = 50
,因为它既修改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 ) ;
这是明确定义的,将产生您预期的结果。
请注意,该语言将零和非零定义为分别表示假和真,而不是具体地表示零和一。