可以将文章内容翻译成中文,广告屏蔽插件会导致该功能失效:
问题:
I understand the difference between this operations (post-increment, pre-increment). But question: I have an expression:
int x = 4;
long y = x * 4 - x++;
The highest priority has post-unary operator, than "*" and last "-". In my opinion it will be:
long y = x * 4 - x++;
1). x++ => return 4 (save x = 5)
2). final expression: 5 * 4 - 4 = 16
But when I compile this in IDE the answer is 12 ! What's a problem and where did I do smth. wrong?
回答1:
EDITED
Here are the steps to evaluate the expression:
Evaluate all the expression that has increment/decrement from left to right
Replace all variable with their true value
Evaluate the expression using PEMDAS rule
Example:
int x = 4;
int y = ++x * 5 / x-- + --x;
first we need to substitute all values of x before evaluating the expression (substitute from left to right)
++x -> since it is a post increment we will first increment x before substituting, thus x will be 5
5 * 5 / x-- + --x -> this will be the new equation
now we will substitute x in x--
x-- -> since it is a post decrement x here will be substituted with 5 and after the substitution decrement x, thus x will be 4
5 * 5 / 5 + --x -> this will be the new equation
now we will substitute x in --x
--x -> since it is a pre decrement we will first decrement x substituting, thus x will be 3
5 * 5 / 5 + 3 // this will be the new equation
Since there are no variables in the equation we will now evaluate the expression using PEMDAS
25 / 5 + 3 5 + 3
8
thus the result will be 8
回答2:
x evaluates to 4, and x++ evaluates to 4 as well, and then gets incremented to 5. So it's essentially 4 * 4 - 4 , which gives 12 as expected.
回答3:
Multiplication is resolved separately, so x == 4. Incrementation occurs afterwards, so it's actually 4 * 4 - 4 == 12 and after this operation x == 5.
回答4:
The left side of a subtraction is always computed before the right side because subtraction is left associative i.e. 5 - 2 - 1 is (5 - 2) - 1, not 5 - (2 - 1).
This is why the multiplication happens before the increment. Associativity determines what happens first here, not precedence.
回答5:
long y = 4 * 4 - 4;
x will be incremented after this assignment
Everytime x is "called" with x++ it gets incremented after E.g.
int x = 1;
System.out.println(x++ + x++ * x++ + x++);
// 1 + 2 * 3 + 4