a=a++,a =++a
下列代码输出是?从JVM的角度讲讲发生了什么
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
a++;
b = b++;
c = ++c;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
部分字节码:
stack=2, locals=4, args_size=1
0: bipush 10
2: istore_1
3: bipush 20
5: istore_2
6: bipush 30
8: istore_3
9: iinc 1, 1
12: iload_2
13: iinc 2, 1
16: istore_2
17: iinc 3, 1
20: iload_3
21: istore_3
(请忽略下图中运行时常量池里的指令)
此例中,主要涉及以下几部分组件。
堆,存放对象
执行引擎,用来执行指令
堆栈,存放变量表和操作数栈
方法区,方法字节码会载入方法区
指令科普:
istore_x 将操作数栈栈顶元素弹出,放入局部变量表的 slot x中
iload_x 将 局部变量中x位置的元素 放到操作数栈中
iinc 1,1 (iinc, (value1,value2) value1是对哪个位置的数操作,value2是给value1加多少)
对于a
9: iinc 1, 1 // 将局部变量1号位+1,自增后,1号位置 11
对于b
iload_2 //将局部变量2号位置放入操作数栈中,此时操作数栈 20
iinc 2, 1 // 将局部变量2号位+1,自增后,2号位置 21,操作数中 20
istore_2 //将操作数栈栈顶元素弹出,放入局部变量表的2号位置中 此时,2号位置20,操作数中20
对于c
iinc 3, 1 // 将局部变量3号位+1,自增后,3号位置 31,操作数中 空
iload_3 // 将3号位置放入操作数栈,操作数中 31
istore_3 // 将操作数栈栈顶元素弹出,放入局部变量表的3号位置中,将31赋值给31,此时c=31
输出
a=11
b=20
c=31
ps:如果此例子看不懂请移步这里:图解方法流程