先看一段代码:inti=0;inta=i++;sout("a的值为:"+i);sout("i的值为:"+i);最终编译出的核心字节码如下L0BITPUSH0//将常量0压入操作栈ISTORE_1//弹出当前栈顶元素,保存到局部变量表的slot_1中L1ILOAD_1//取值从局部变量表的第一个槽位开始,压入操作栈顶IINC0,1//直接自增槽位(+1)中的值,注意此时是ISTORE_2,什么都没有dowiththecurrentstack//弹出当前栈的栈顶元素并保存到局部变量表的slot_2中L2ILOAD_2//从局部变量表的第二个槽中取值并压入栈顶operationstackIRETURN//返回栈顶元素这里有两点需要注意:IINC的自增操作不影响当前栈顶元素,slot_1中的元素自增后,从0变成了1ISTORE_2,弹出栈顶元素值还是0,最后输出的结果没有改变:a的值为:0i的值为:1;我这里画图帮助大家理解再看++iinti=0;inta=++i;sout("a的值为:"+i);sout("i的值为:"+i);对于++i,对应的字节码如下,先自增再入栈,结果就很清楚了。最后核心编译后的字节码如下L0BITPUSH0//将常量0压入操作栈ISTORE_1//弹出并保存当前栈顶元素到局部变量表的slot_1L1IINC0,1//直接增加slotslot(+1)中的值来操作ILOAD_1//从局部变量表的第一个slotslot中获取值(此时值已经自增),Push操作栈顶ISTORE_2//弹出当前栈顶元素并保存到局部变量表的slot_2L3ILOAD_2//从局部变量表的第二个槽中获取值,将操作压栈顶IRETURN//返回的最终输出结果栈顶元素为:a的值为:1i的值为:1;总结一下i++和++i的理论区别就是:i++:先把i拿出来用,再+1;++i:先放入i+1,再取出来使用;来源:blog.csdn.net/qq_37107280/article/details/112044758近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.最好的!Java协程来了。.3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
