public class TestPlusOne {
public static void main(String[] args) {
int i = 1;
i = i++;
System.out.println(i);
}
}
可能有许多小伙伴认为结果等2,这是不对的,为什么等于1可以从jvm执行的指令看,
这里涉及 jvm栈知识:
jvm 栈存放的是栈帧(Frame),每个方法对应一个栈帧,每个栈帧包含四项内容
1. Local Variable Table 局部变量表
2. Operand Stack 操作数栈
3. Dynamic Linking
4. return address: a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方
下面解释下指令含义
0 iconst_1:将“1”压入操作数栈
单击显示jvm规范进入
1 istore_1:将栈中的元素弹出,放到局部变量表中1的位置
局部变量表1的位置
2 iload_1:将局部变量表1位置的数取出放到栈中
3 iinc 1 by 1:
局部变量表1的位置加上1(操作完成后局部变量表1位置的值为2)
6 istore_1:将栈中的值(此时为1)赋值给本地变量表1的位置(操作完成后局部变量表1位置的值又变成了1)
因此最后打印的值为1;