如果&&的优先顺序不大于||,这个代码不应该评估--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;
答案 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)
这里有两个概念
在C中,||运算符是左关联的。结果,将首先评估++。
由于左侧为TRUE,编译器优化短路将确保||的右侧未评估,因为它不会更改表达式的结果。
答案 4 :(得分:0)
--b && ++c
根本没有评估。