开讲前肯定得先来道题呗
public class Demo01 {
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
这边先不讲字节码的事。
一步一步来讲解这中间都发生了啥?
int i = 1 ;
这个我就不说了。。
看我画的图之前,在这里先进行一些总结:
自增、自减操作都是直接修改变量的值,不经过操作数栈
赋值之前,临时结果也是存放在操作栈中的
=右边的 从左到右加载值 依次压入操作数栈
(下面的图 “操作栈” 应该为 “操作数栈” ,不影响理解)
上面得到 i = 1
这里, j = 1, i = 2
这张图比较粗糙,仔细看应该能看得懂。
如果还想深究的,可以来了解下字节码
0: iconst_1
1: istore_1
2: iload_1 //将第二个 int 型本地变量推送至栈顶
3: iinc 1, 1 //将指定 int 型变量增加指定值 (如 i++, i--, i+=2 等)
6: istore_1 //栈顶 int 型数值存入第二个本地变量
7: iload_1 //将第二个 int 型本地变量推送至栈顶
8: iinc 1, 1
11: istore_2
12: iload_1
13: iinc 1, 1
16: iload_1
17: iload_1 //这里进行++i 操作 分为3个步骤了
18: iinc 1, 1
21: imul
22: iadd
23: istore_3
如果觉得有啥不妥的,可以评论留言呀。