如果 && 的优先级大于 || 的优先级,那么这段代码不应该先评估 --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;
如果 && 的优先级大于 || 的优先级,那么这段代码不应该先评估 --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;
这段代码不应该先评估 --b && ++c
无运算符优先级不会影响评估顺序。这只是意味着
a++||--b&&++c
相当于
a++||(--b&&++c)
所以它仍然a++
是首先评估的,因此使语句短路。
的优先级&&
更高,这意味着它与左右两侧的事物的绑定比 . 更紧密||
。所以这个表达式等价于
a++ || (--b && ++c)
||
仅当左侧表达式的计算结果为非 0 时才计算右侧的事物。由于 a 是1
, onlya++
将被评估,b
不会递减,c
也不会递增。
是的,&&
具有更高的优先级,但这仅决定操作数的分组,而不是评估的顺序。这里的基本操作是||
,它保证如果左边为真,则不计算其右侧,无论右侧有什么操作。
这里有两个概念在起作用
在 C 中,|| 运算符是左结合的。结果,将首先评估 a++。由于左侧为 TRUE,编译器优化短路将确保 || 的右侧 不被评估,因为它不会改变表达式的结果。
--b && ++c
根本不评价。