问题
When an expression has two operators with the same precedence, the expression is evaluated according to its associativity. I want to know how the following works:
i=b + b + ++b
i
here is 4
So ++b
didn't change the first 2 b
values, but it executed first, because the execution is from left to right.
Here, however:
int b=1;
i= b+ ++b + ++b ;
i
is 6
According to associativity, we should execute the 3rd b
so it should be:
1+ (++1) + ( ++1 should be done first)
. so it becomes:
1 + ++1 + 2 =5
However, this is not right, so how does this work?
回答1:
You are confusing precedence with order of execution.
Example:
a[b] += b += c * d + e * f * g
Precedence rules state that *
comes before +
comes before +=
. Associativity rules (which are part of precedence rules) state that *
is left-associative and +=
is right-associative.
Precedence/associativity rules basically define the application of implicit parenthesis, converting the above expression into:
a[b] += ( b += ( (c * d) + ((e * f) * g) ) )
However, this expression is still evaluated left-to-right.
This means that the index value of b
in the expression a[b]
will use the value of b
from before the b += ...
is executed.
For a more complicated example, mixing ++
and +=
operators, see the question Incrementor logic, and the detailed answer of how it works.
回答2:
It's correct, first b is 1, and the second b will be incremented by 1 before addition, so it's 2, and the third b is already 2, and incremented by 1 makes it 3. so It's 6 in total. The expression is evaluated from left to right as you said, thus the third b is already 2 before increment.
来源:https://stackoverflow.com/questions/36956282/operator-precedence-and-associativity