先看一段代碼: int i = 0; int a = i++; sout("a的值是:"+i); sout("i的值是:"+i); 最終的編譯之後的核心位元組碼如下 L0 BITPUSH 0 //將常量0壓入操作棧 ISTORE_1 //將當前棧頂元素,彈出並保存到局部變數表的slot_1中 L1 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變成了1ISTORE_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最新版)
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
覺得不錯,別忘了隨手點贊+轉發哦!