第一季:1自增变量
题目
如下代码的运行结果︰
public static void main(String[]args){
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i* i++;
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
}
结果
i=4
j=1
k=11
分析
public class Test1 {
public static void main(String[]args){
int i = 1;
i = i++;
// ①把i的值1压入操作数栈1
// ②i变量自增1(在局部变量表中为2)
// ③把操作数栈的值1赋给i为1
// 对应0-6
int j = i++;
// ①把i的值1压入操作数栈1
// ②i变量自增1(在局部变量表中为2)
// ③把操作数栈的值1赋给j为2
// 最后i更新为2
// 对应7-11
int k = i+ ++i* i++;//i=4 k=2+3*3
// ①把i的值2压入操作数栈为2
// ②i变量自增1(在局部变量表中为3)
// ③把i的值3压入操作数栈为3
// ④把i的值3压入操作数栈为3
// ⑤i变量自增1(在局部变量表中为4)
// ⑥把操作数栈中前两个(3,3,2)弹出来求乘积再压入栈(9,2)
// ⑦把操作数栈的值(9,2)弹出求和再赋给k为12
// 最后i更新为4
// 对应12-23
System.out.println("i="+i);//4
System.out.println("j="+j);//2
System.out.println("k="+k);//11
}
}
字节码文件
小结
- 赋值=,最后计算
- =右边的从左到右加载值依次压入操作数栈
- 实际先算哪个,看运算符优先级
- 自增、自减操作都是直接修改变量的值,不经过操作数栈
- 最后的赋值之前,临时结果也是存储在操作数栈中
- 建议: 《JVM虚拟机规范》关于指令的部分