问题
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