public class Test {
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
1-4步操作指令:
0 iconst_1
1 istore_1 //截止为第一步
2 iload_1
3 iinc 1 by 1
6 istore_1 //截止为第二步
7 iload_1
8 iinc 1 by 1
11 istore_2 //截止为第三步
12 iload_1
13 iinc 1 by 1
16 iload_1
17 iload_1
18 iinc 1 by 1
21 imul
22 iadd
23 istore_3 //截止为第四步
步骤解读:
- int i=1; 定义常量i,i放入局部变量表
- i=i++; 将局部变量i压入操作数栈,i自增,赋值 三步!! 局部变量中i=1
- int j=i++; 将局部变量i压入操作数栈,自增,将栈中i的值赋给j,局部变量表中i=2,j=1
- int k=i+ ++i*i++; 将局部变量i压入操作数栈,i自增,将i值压入栈两次,i自增,先算乘法,再算加法,最后赋值
- 最后局部变量表中 i=4,k=11,前面得出 j=1
小结:
- 赋值=,最后计算
- =右边的从左到右加载的值依次压入操作数栈
- 实际先算哪个,看运算符优先级
- 自增,自减操作都是直接修改变量的值,不经过操作数栈
- 最后赋值之前,临时结果也是存储在操作数栈中
- 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量,
- 操作数栈:Java虚拟机的解释执行引擎被称为"基于栈的执行引擎",其中所指的栈就是指-操作数栈,虚拟机把操作数栈作为它的工作区——大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈