位元組碼指令分析 ++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中的i++和++iJava
- C++複習整理---i++和++iC++
- Java位元組碼指令表Java
- synchronized下的 i+=2 和 i++ i++執行結果居然不一樣synchronized
- 你真的瞭解 i++, ++i 和 i+++++i 以及 i+++i++ 嗎?
- 【Java】JVM位元組碼分析JavaJVM
- C++中的i++和++i你真的理解嗎?C++
- Class檔案結構&位元組碼指令
- 位元組碼底層分析String
- 例項分析理解Java位元組碼Java
- 最新寬位元組注入攻擊和程式碼分析技術
- 深入淺出JVM(十)之位元組碼指令(下篇)JVM
- i++引發的慘案
- 位元組碼
- jvm是如何執行i = i++ + ++i的,你知道嗎?JVM
- 關於 i=i++ 問題、入棧順序
- JVM(四):深入分析Java位元組碼-下JVMJava
- JVM(三):深入分析Java位元組碼-上JVMJava
- 好程式設計師web前端教程分享初學者搞懂i++和++i程式設計師Web前端
- Java中 i=i++ 問題底層原理解析Java
- Java 位元組碼Java
- Dalvik 和 Java 位元組碼的比較Java
- 一個關於 i++ 和 ++i 的面試題打趴了所有人面試題
- 機器碼和位元組碼分別介紹機器碼
- 使用javap分析Java位元組碼的一個例子Java
- 什麼是位元組碼?python位元組碼詳細介紹!Python
- jvm位元組碼和類載入機制JVM
- 位元組碼基礎
- 位元組碼詳解
- 位元組碼技術在模組依賴分析中的應用
- 位元組碼層面深入分析Java列舉類Java
- modbus和位元組序
- 位、位元組和字
- 【JVM原始碼解析】模板直譯器解釋執行Java位元組碼指令(上)JVM原始碼Java
- Java的位元組碼和ABAP load的比較Java
- 硬核萬字長文,深入理解 Java 位元組碼指令(建議收藏)Java