目录

字节码图解i++

目录

直接给出如下代码,问运行结果

https://gitee.com/lienhui68/picStore/raw/master/null/20200719044645.png

我们使用javap来解析二进制字节码文件,使用图解的方式依次分析t1-t5。

指令集参考{%post_link 工作/200_编程语言/java/jvm/jvm指令集 jvm指令集%}

t1

字节码

https://gitee.com/lienhui68/picStore/raw/master/null/20200719040507.png

stack=1: 操作数栈大小为1

locals=3: 局部变量表大小为3,其中slot0存储this地址

执行过程

https://gitee.com/lienhui68/picStore/raw/master/null/20200719040713.png

总结:++i 是先对i1 执行+1操作后,再load出来, 此时栈顶为2, i1=2,i2=2

t2

字节码

https://gitee.com/lienhui68/picStore/raw/master/null/20200719040731.png

执行过程

https://gitee.com/lienhui68/picStore/raw/master/null/20200719041626.png

总结:i++ 是先load i1, 再对i1 执行+1操作,此时栈顶还是1,i1=2,i2=1

t3

字节码

https://gitee.com/lienhui68/picStore/raw/master/null/20200719041811.png

执行过程

https://gitee.com/lienhui68/picStore/raw/master/null/20200719042321.png

总结:同t1, 区别无非就是store回i1还是i2,注意此时局部变量表长度为2,i1=2

t4

字节码

https://gitee.com/lienhui68/picStore/raw/master/null/20200719042336.png

执行过程

https://gitee.com/lienhui68/picStore/raw/master/null/20200719042526.png

总结:同t2, 区别是最后store回i1, i1=1

t5

字节码

https://gitee.com/lienhui68/picStore/raw/master/null/20200719042831.png

执行过程

https://gitee.com/lienhui68/picStore/raw/master/null/20200719043635.png

总结:连续对局部变量表i1位置执行+1操作,此时i1=3, 再将i1入栈, 执行iadd操作, 最后结果为4.