先看一段代碼:
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最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/451223.html
標籤:Java
