位元組碼指令分析 ++i 和 i++
源起:
最近在學jvm,碰到一道分析題,用位元組碼指令分析++i 和 i++的區別,相信大家對++i 和 i++的區別應該非常熟悉,但是具體為什麼會這樣可能還是一知半解,這篇分享和大家共同解惑。
程式碼:
程式碼非常簡單,這裡就只分析question02了,下面的內容如果不熟悉區域性變數表和運算元棧的可能不太容易理解。
public void test03(){
// question01
int i1 = 10;
i1++;
int i2 = 10;
++i2;
//question02
int i3 = 10;
int i4 = i3++;
int i5 = 10;
int i6 = ++i5;
//question03
int i7 = 10;
i7 = i7++;
int i8 = 10;
i8 = ++i8;
//question04
int i9 = 10;
int i11 = 10;
int i10 = i9++ + ++i9;
int i12 = ++i11 + i11++;
}
位元組碼:
我用的是jclasslib外掛看的位元組碼,但是不知道為啥,裡面字型很小,如果朋友們知道怎麼處理,請務必分享給我,十分感謝!!!
分析第7到第11行:
首先 bipush 把i3壓入運算元棧,然後 istore_3 把這個值存到區域性變數表,到這裡,int i3 = 10;這句話就執行完畢了,接下來重點來了, iload_3 然後iinc 3 by 1 表示先把i3取到了運算元棧,然後在區域性變數表中自增一,最後istore 4 把運算元棧中的i3存入區域性變數表,因為自增行為繞過了運算元棧,所以istore 4時存的值為10,而不是自增後的值。
分析第12到16行
12,13行和第7,8行的操作是一樣的,不再贅述,重點是第14-16行,14:iload_5 然後iinc 3 by 1 :先在區域性變數表中自增,然後iload 5,把自增後的值讀到運算元棧中,最後istore 6 存到一個新的區域性變數中,這樣就完成了先自增再儲存。我相信這裡能理解的話,下面的也沒問題了,大家可以自己去看看。
相關文章
- 位元組碼指令
- 圖解i++和++i圖解
- Java位元組碼指令Java
- Java位元組碼指令表Java
- 關於java中的i++和++iJava
- C++複習整理---i++和++iC++
- 【Java】JVM位元組碼分析JavaJVM
- synchronized下的 i+=2 和 i++ i++執行結果居然不一樣synchronized
- Class檔案結構&位元組碼指令
- 字元,位元組和編碼字元
- C++中的i++和++i你真的理解嗎?C++
- 位元組碼底層分析String
- 例項分析理解Java位元組碼Java
- JVMClass詳解之二Method位元組碼指令JVM
- java中i=i++的問題Java
- 最新寬位元組注入攻擊和程式碼分析技術
- jvm 虛擬機器位元組碼指令表JVM虛擬機
- 深入淺出JVM(十)之位元組碼指令(下篇)JVM
- JVM 位元組碼執行例項分析JVM
- JVM(三):深入分析Java位元組碼-上JVMJava
- JVM(四):深入分析Java位元組碼-下JVMJava
- Java 位元組碼Java
- c語言中i++與++i的使用技巧C語言
- 機器碼和位元組碼分別介紹機器碼
- 好程式設計師web前端教程分享初學者搞懂i++和++i程式設計師Web前端
- 使用javap分析Java位元組碼的一個例子Java
- jvm是如何執行i = i++ + ++i的,你知道嗎?JVM
- 位元組碼基礎
- 位元組碼詳解
- JAVA的i++, i+=1, i=i+1有區別嗎?Java
- modbus和位元組序
- jvm位元組碼和類載入機制JVM
- Dalvik 和 Java 位元組碼的比較Java
- 什麼是位元組碼?python位元組碼詳細介紹!Python
- 一個關於 i++ 和 ++i 的面試題打趴了所有人面試題
- c# for(int i;i<3;i++)迴圈的執行次序C#
- 深入理解JAVA虛擬機器學習筆記18——位元組碼指令2(運算指令)Java虛擬機機器學習筆記
- 位元組碼層面深入分析Java列舉類Java