先写一段java测试代码
public void testInc() {
int i = 0;
int b = i++;
int c = ++i;
}
编译成jvm指令后如下:
0 iconst_0 // 将常量0入栈
1 istore_1 // 将栈顶的i数据出栈保存到局部变量表索引为1的位置
2 iload_1 // 将局部变量表索引为1的变量入栈
3 iinc 1 by 1 // 局部变量表索引为1的变量递增
6 istore_2 // 将栈顶的数据保存到局部变量表索引为2的位置
7 iinc 1 by 1 // 局部变量表索引为1的变量递增
10 iload_1 // 将局部变量表索引为1的变量入栈
11 istore_3 // 将栈顶的数据保存到局部变量表索引为3的位置
12 return
数据变化过程是这样子的:
开始前:i未初始化;b未初始化;c未初始化;操作数栈=[];
0行指令: i、b、c保持不变;操作数栈=[0];
1行指令: i=0;b、c保持不变;操作数栈=[];
2行指令:i=0;b、c保持不变;操作数栈=[0];
3行指令:i=1;b、c保持不变;操作数栈=[0];
6行指令:i=1;b=0;c保持不变;操作数栈=[];
7行指令:i=2;b=0;c保持不变;操作数栈=[];
6行指令:i=2;b=0;c保持不变;操作数栈=[2];
7行指令:i=2;b=0;c=2;操作数栈=[];
总结:
共同点:都是先将局部变量入栈,然后出栈保存到局部变量表。
不同点:i++是先入栈再递增;i++是先递增再入栈。