理解i++
# 面试题
/**
* 变量表, 值栈
* 赋值=,最后计算
* =右边的从左到右加载值依次压入操作数栈
* 实际先算哪个,看运算符优先级
* 自增、自减操作都是直接修改变量的值,不经过操作数栈
* 最后的赋值之前,临时结果也是存储在操作数栈中
*/
public class TestPlus {
public static void main(String[] args) {
int i = 1;
i = i++; // 步骤:i的值压入值栈,为1,i变量由1变成了2,最后又将值栈赋给变量i,因此i仍然为1
int j = i++; // i的值压入值栈,为1,i变量由1变成了2,最后又将值栈赋给变量j,因此i变成了2,j为1
int k = i + ++i * i++; // 先i的值压入值栈,为2, ++i i变量由2变成3 压入值栈, i++ i变量仍然为3,压入值栈,i再增1。值栈3*3+2结果为11
System.out.println("i=" + i); // 4
System.out.println("j=" + j); // 1
System.out.println("k=" + k); //11
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20



•赋值=,最后计算
•=右边的从左到右加载值依次压入操作数栈
•实际先算哪个,看运算符优先级
•自增、自减操作都是直接修改变量的值,不经过操作数栈
•最后的赋值之前,临时结果也是存储在操作数栈中
•建议:《JVM虚拟机规范》关于指令的部分