int main() {
int i = -3, j = 2, k = 0, m;
m = ++i || ++j && ++k;
printf("%d %d %d %d\n", i, j, k, m);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为&&有更多的优先权|| 根据这个逻辑++j应该执行,但它永远不会和程序输出-2 2 0 1.这里发生了什么?中间步骤是什么?
sep*_*p2k 14
&&确实具有更高的优先级||,这意味着++i || ++j && ++k解析为++i || (++j && ++k).
然而,这并没有改变RHS ||仅在LHS返回时执行的事实0.
优先权不会影响评估顺序.
优先级对评估顺序没有影响(除非必要 - 由于优先权,某些子表达式可能需要在其他子表达式之前进行评估).例如,在简单表达式中:
a() + b() + c() * d()
Run Code Online (Sandbox Code Playgroud)
即使乘法优先于加法,编译器也可以按照自己喜欢的任何顺序自由执行函数调用,也可以调用a()或b()在执行乘法之前或之后调用.显然,它确实有评估c()和d()它执行乘法之前.如果这些函数具有副作用(如修改和使用全局变量),则不确定的评估顺序可能会导致意外结果.
但是,对于某些运营商而言,该标准确实规定了严格的评估顺序.这是关于||逻辑或运算符的说法:
与按位|不同 运算符,|| 运营商保证从左到右的评估; 在评估第一个操作数后有一个序列点.如果第一个操作数比较不等于0,则不计算第二个操作数.
因此,不仅||提供了排序保证,还保证在某些条件下,第二个操作数根本不会被评估.
(它也说了类似的东西&&- 除了在那种情况下,如果第一个操作数的第一个计算结果为0,则不计算第二个操作数.但在你的例子中,第一个||是第一个).
提供一些排序保证的其他运算符包括逗号运算符和函数调用(它保证已经评估了参数,但不是评估这些参数的顺序).
| 归档时间: |
|
| 查看次数: |
763 次 |
| 最近记录: |