我认为当要检查的语句为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
答案 0 :(得分:6)
C参数未定义在函数的参数中同时具有x == 35
和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标准定义的。
答案 1 :(得分:1)
声明:
{{ movie }}; categories:
{% for category in movie.categories.all %}
{{ category }}
{% endfor %}
修改printf("\n%d %d %d",x==35,x=50,x>40);
,以便(在这种情况下)执行测试x
时,x==35
等于50。
函数参数的评估顺序不确定,因此在其他情况下结果可能会有所不同。应该避免这样的代码。考虑:
x
定义明确,将会产生您期望的结果。
请注意,该语言将零和非零定义为分别代表false和true,而不是专门代表0和1。
答案 2 :(得分:-4)
printf没有指定执行顺序。这取决于编译器。有时它的评估是从右到左,反之亦然。即使它可以按随机顺序进行评估。因此,如果您在在线IDE(https://www.codechef.com/ide)上编译相同的代码,则输出将不同(0,50,0)。