圖解 i++ 和 ++i 的區別,看了必懂...


先看一段代碼:

int i = 0;
int a = i++;
sout("a的值是:"+i);
sout("i的值是:"+i);

最終的編譯之后的核心字節碼如下

L0
 BITPUSH 0  //將常量0壓入操作棧
 ISTORE_1  //將當前棧頂元素,彈出並保存到局部變量表的slot_1中

L1
 ILOAD_1   //從局部變量表的第一個slot槽中,取出該值,壓入操作棧頂
 IINC 0,1    //直接將slot槽中的值自增(+1)操作,注意此時是與當前棧無關的
 ISTORE_2   //將當前棧頂元素,彈出並保存到局部變量表的slot_2中

L2
 ILOAD_2    //從局部變量表的第二個slot槽中,取出該值,壓入操作棧頂
  IRETURN  //返回棧頂元素

這里有兩個注意點:

  • IINC 的自增操作,並未影響當前的棧頂元素,並且 slot_1 中的元素自增完成后,已經由0變成了1
  • ISTORE_2 彈出的棧頂元素值依舊是0,並未改變

最終的輸出的結果為:

a的值是: 0
i的值是: 1;

我這里畫了一個圖來幫助大家理解

再來看看++i

int i = 0;
int a = ++i;
sout("a的值是:"+i);
sout("i的值是:"+i);

對於++i 來說,對應的字節碼如下,先自增再入棧,那么結果就很清晰了

最終的核心編譯之后的字節碼如下

L0
 BITPUSH 0  //將常量0壓入操作棧
 ISTORE_1  //將當前棧頂元素,彈出並保存到局部變量表的slot_1中

L1
 IINC 0,1    //直接將slot槽中的值自增(+1)操作
 ILOAD_1   //從局部變量表的第一個slot槽中,取出該值(該值此時已經自增過了),壓入操作棧頂
 ISTORE_2   //將當前棧頂元素,彈出並保存到局部變量表的slot_2中

L3
 ILOAD_2    //從局部變量表的第二個slot槽中,取出該值,壓入操作棧頂
 IRETURN  //返回棧頂元素

最終的輸出的結果為:

a的值是: 1
i的值是: 1;

總結

i++ 和 ++i 在理論上的區別是 :

  • i++:是先把i拿出來使用,然后再+1;
  • ++i :是先把i+1,然后再拿出來使用;

來源:blog.csdn.net/qq_37107280/article/details/112044758

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM