之前我们常说的i++是先自增后操作,++i则是先操作后自增,运行一下代码:
1 2 3 4 5 6 | int i= 1 ; System.out.println( "初始i值:" +i); i=i++; System.out.println( "i++后i值:" +i); i=++i; System.out.println( "++i后i值:" +i); |
想着应该是1,2,3,但结果却为:
1 2 3 | 初始i值: 1 i++后i值: 1 ++i后i值: 2 |
其实在执行i=i++的过程中,是先找了一个临时变量temp存储i,而后将i+1赋给i,再将temp赋给i,即:
1 2 3 4 | int i= 1 ; int temp = i; i = i+ 1 ; i = temp; |
为了区分两个i,也可以写成下面的形式:
1 2 3 | int i= 1 ; int j=i++; //等价于<br>int i=1;<br>int temp = i;<br><em id="__mceDel"><em id="__mceDel">i = i+1;<br><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">j = temp;</em></em></em></em><br></em></em> |
而在执行i=++i时,是将i(1)原地赋值给i后,进行了自增的操作,即
1 2 | i=i; i=i= 1 ; |
这主要与JVM有关,在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,反汇编代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | stack= 1 , locals= 2 , args_size= 1 <br> //int i=1; 0 : iconst_1 //常量值1 1 : istore_1 //将常量1存入变量i中,入栈<br> //i=i++ 2 : iload_1 //开辟一块内存空间加载i值,temp=i=1 3 : iinc 1 , 1 //i自增为2 6 : istore_1 //将temp的值存入变量i中,i仍为1<br> //i=++i; 7 : iinc 1 , 1 //将i自增为2 10 : iload_1 //将自增后的i入栈 11 : istore_1 //加载栈顶的i并重新赋给i,此时i为2 12 : return LineNumberTable: line 3 : 0 line 5 : 2 line 7 : 7 line 10 : 12 |
上面的汇编代码,我理解的不算太好,应该是有点问题的,不过程序代码可参考上面写的去理解
小tips:
查看汇编代码,命令行cmd
1 2 | javac Main.java javap -c -v Main. class |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具