Increment and logical operators precedence [duplicate]

两盒软妹~` 提交于 2019-12-09 01:50:32

问题


In the program shown below, prefix should be evaluated first because it has higher precedence, But answer is -2, 2, 0, 1 and it is explained in book "as LHS of || is true RHS is not evaluated."
Why is it so? All the increments should performed first and then logical should be checked because of precedence.

#include<stdio.h>

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;
}

回答1:


Don't get confused with Precedence and Order of evaluation.

The order of evaluation of logical OR || is left to right.

So if left = true then left || right will never execute right. In your code exactly same happened.

As you know, any non zero value treated as true in C, hence, ++i or -2 is true. So,

 m = ++i || ++j && ++k;
 m = true || bla bla bla; //right not even checked!
 m = true 
 m = 1

And you get the output as expected.




回答2:


The logical && and || operators fully evaluate the LHS before doing any evaluation of the RHS.

In the code shown, since ++i is -2, the LHS of the || evaluates to true (1) and the RHS is not evaluated. Therefore, neither j nor k is incremented. The printed result follows: m was assigned 1, i became -2, and j stayed as 2 and k stayed as 0.

The only remaining issue is that && binds tighter than ||, so:

a || b && c

is equivalent to:

a || (b && c)

so if a evaluates to true (non-zero), then neither b nor c is evaluated.




回答3:


Operator precedence is a completely different thing. Order of evaluation is determined by side effects and sequence points.

see this manual on order of evaluation.



来源:https://stackoverflow.com/questions/31198840/increment-and-logical-operators-precedence

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!