5

如果 && 的优先级大于 || 的优先级,那么这段代码不应该先评估 --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;
4

5 回答 5

14

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

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

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

相当于

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

所以它仍然a++是首先评估的,因此使语句短路。

于 2012-05-23T17:30:12.210 回答
2

的优先级&&更高,这意味着它与左右两侧的事物的绑定比 . 更紧密||。所以这个表达式等价于

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

||仅当左侧表达式的计算结果为非 0 时才计算右侧的事物。由于 a 是1, onlya++将被评估,b不会递减,c也不会递增。

于 2012-05-23T17:30:43.280 回答
2

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

于 2012-05-23T17:36:31.927 回答
1

这里有两个概念在起作用

  1. 运算符关联性
  2. 编译器优化短路

在 C 中,|| 运算符是左结合的。结果,将首先评估 a++。由于左侧为 TRUE,编译器优化短路将确保 || 的右侧 不被评估,因为它不会改变表达式的结果。

于 2012-05-23T21:08:38.367 回答
0

懒惰的评价

--b && ++c根本不评价。

于 2012-05-23T17:32:22.650 回答