基础
public static void main(String[] args) throws Exception {
int i = 5;
int a = ++i;
int j = 6;
int b = j++;
}
编译为字节码指令:
0: iconst_5
1: istore_1 // 将5存放到【局部变量表】下标为1的位置
2: iinc 1, 1 // 将下标为1的位置的值+1, 即 5+1 = 6
5: iload_1 // 将下标为1的位置的值放到【操作数栈】
6: istore_2 // 将【操作数栈】栈顶的值存入【局部变量表】下标为2处
7: bipush 6 // 将6压入【操作数栈】中
9: istore_3 // 将【操作数栈】栈顶的值放入【局部变量表】下标为3处
10: iload_3 // 将下标为3的位置的值放到【操作数栈】
11: iinc 3, 1 // 下标为3的位置的值+1, 即 6 + 1 = 7
14: istore 4 // 将【操作数栈】栈顶的值存入【局部变量表】下标为4处
16: return
对于 x = ++i, ① i所在局部变量表中值+1 ② i压栈 ③ 栈顶值存进x对应的局部变量表位置
iinc 1,1
iload_1
istore_2
对于 x = i++, ① i压栈 ② i所在局部变量表中值 +1 ③ 栈顶值存进x对应的局部变量表位置
iload_3
iinc 3,1
istore 4
扩展
public static void main(String[] args) throws Exception {
int i = 5;
i = i++;
System.out.println(i);
}
这里i值为多少?
答案是5.
分析:
对应上面的顺序 , ① i压栈 (值为5) ② i 所在局部变量表中值+1(5 + 1 = 6) ③ 栈顶值存进i对应的局部变量表位置 (又将6覆盖成了5)