2014-08-28 69 views
0

我们有一个表达优先级和结合在逻辑运算符用C

int x,y,z; 
x=y=z=2; 

y=++x || --y; 

printf("%d %d",x,y); 

它给x=3y=2作为输出,但我认为我们在这里有4个运营商:++--||=

我们知道++--具有最高的优先级,所以他们必须先评估,然后||,然后=

另外我们知道++--具有相同的优先级,所以我们使用关联性,在这种情况下,它是正确的左边。所以我认为首先--y将被评估,其中y=1,然后++x这应该给x=3,然后||应评估。

为什么我从我的机器得到不同的答案?谢谢。

+2

优先顺序与评估顺序无关。无论如何,它是未定义的行为,如果'--y'被评估。在这种情况下,你实际寻找的是短路评估,因为实际上'--y'在这里没有被评估。 – chris 2014-08-28 18:27:16

+0

请停止使用复杂,无方括号的表达式和可疑行为编写垃圾代码。它会让你被解雇。 – 2014-08-28 20:58:15

回答

1

操作员的优先级与评估顺序无关。请注意,子表达式的评估顺序与结合性和优先级无关。

,其中在被评估的表达式的操作数是 未指定在C的唯一保证是,它们都将在 下一序列点完全评价的顺序。

对您的情况x++进行了评估,其中--y未被评估,它正在为您创建问题。

+0

这个特殊情况不是未定义的,因为'++ x'是“true”。 – chris 2014-08-28 18:30:15

+0

@chris: - 是的。感谢您指出! – 2014-08-28 18:31:19

+0

请清楚解释。那么优先级和相关性的需求是什么?为什么他们说操作员具有同等优先权时,我们需要从右向左进行评估?如果您可以举例说明,那么它会更便于理解。 – Navdeep 2014-08-28 18:39:50