1、源码和字节码
(1)源码
public class MyTest { public static void main(String[] args){ int a=10; int b=a++ + ++a +a--; System.out.println(a);//11 System.out.println(b);//34 } }
(2)字节码
2、过程分析
(1)字节码指令分析
方法区:
第二步:
第三步:
iinc 1,1:将1号槽位的数据自增1
至此,a++执行完毕
第四步:++a
将10和12存入操作数栈是为了做加法运算
第五步:操作数栈中的数据相加,弹出10和12,存入22
第六步:
iadd,iload_1:
将操作数栈中的数据相加
第七步:
第八步:iload_1,iload_2
3、jvm角度分析a++与++a的区别
- 在学习jvm之前对a++与++a的理解仅仅停留在a++是先输出a的数值在进行自增操作,相反++a是先进行自增操作再返回a的数值
- 从jvm的角度来看,二者的区别是,a++是先将数据放到操作数栈中,再将数据放到相应的槽位在槽位中进行自增操作,相反,++a是先在槽位中进行自增操作,然后放到操作数栈中