||的评估顺序和&&在c

时间:2012-05-23 17:27:41

标签: c

如果&&的优先顺序不大于||,这个代码不应该评估--b&&首先是++ c,因此输出应该是1 2 4 11.但是这里似乎是短路给1 2 5 10.请帮忙!

int x;
int a=1,b=5,c=10;
x=a++||--b&&++c;
printf("%d %d %d %d\n",x,a,b,c);
return 0;

5 个答案:

答案 0 :(得分:14)

  

这个代码不应该评估--b&& ++ c首先

运算符优先级不会影响评估顺序。它只是意味着

a++||--b&&++c

等于

a++||(--b&&++c)

所以它仍然是a++,它首先被评估,从而使语句短路。

答案 1 :(得分:2)

&&的优先级更高,这意味着它比||更紧密地绑定在左侧和右侧的东西上。所以表达式等同于

a++ || (--b && ++c)
如果左边的表达式计算为非0,则

||仅评估右侧的东西。由于a为1,因此只评估a++b不会递减,c也不会递增。

答案 2 :(得分:2)

是的,&&具有更高的优先级,但这仅确定操作数的分组,而不是评估的顺序。这里的基本操作是||,它保证如果左边是真的,则不评估右侧,无论右侧有什么操作。

答案 3 :(得分:1)

这里有两个概念

  1. 运营商关联性
  2. 编译器优化短路
  3. 在C中,||运算符是左关联的。结果,将首先评估++。 由于左侧为TRUE,编译器优化短路将确保||的右侧未评估,因为它不会更改表达式的结果。

答案 4 :(得分:0)

Lazy evaluation

--b && ++c根本没有评估。