这里关于a++和++a编译成字节码后的区别做一下测试:
这是int b = a++
int a = 1;
int b = a++;得到字节码
Code:
0: iconst_1 //将常量1入 *** 作数栈
1: istore_1 //从 *** 作数栈顶取值,放入局部变量表编号为1的位置
-------以上字节码完成了对a=1的赋值
2: iload_1 //将局部变量表中编号为1的位置加载到 *** 作数栈栈顶--->栈顶=1
3: iinc 1, 1 //局部变变量表编号为1的位置直接+1
6: istore_2 //从 *** 作数栈顶取值,放入局部变量表编号为2的位置 -->也就是把1赋给局部变量b
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
--------------------------------------------------------分割线--------------------------------------------------------------
int a = 1;
int b = ++a;得到字节码
Code:
0: iconst_1
1: istore_1
2: iinc 1, 1
5: iload_1
6: istore_2
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
注意颜色标注的那几行
这里直接给结论:
b=a++是将a的值先入 *** 作数栈,然后局部变量表的a自增,局部变量表的b从 *** 作数栈取值
b=++a是局部变量表a先自增,然后局部变量表a的值入栈,局部变量表的b从 *** 作数栈取值
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)