位元組碼指令分析 i 和 i

2021-10-24 23:28:35 字數 828 閱讀 6998

最近在學jvm,碰到一道分析題,用位元組碼指令分析++i 和 i++的區別,相信大家對++i 和 i++的區別應該非常熟悉,但是具體為什麼會這樣可能還是一知半解,這篇分享和大家共同解惑。

**非常簡單,這裡就只分析question02了,下面的內容如果不熟悉區域性變數表和運算元棧的可能不太容易理解。

public

void

test03()

位元組碼:

我用的是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 存到乙個新的區域性變數中,這樣就完成了先自增再儲存。我相信這裡能理解的話,下面的也沒問題了,大家可以自己去看看。

用java位元組碼解釋i 和 i

原址 先看4個題目 int i 0 i i int i 0 i i int i 0 int j 0 j i i int i 0 int j 0 j i i i 每道題裡的i和j都是多少?用myeclipse測試,結果分別是 i 0,i 1,i 2,j 1,i 3,j 3。i 和 i的問題,困擾很多人...

JVM角度分析i 和 i的區別

最近看jvm的一些相關知識,看到i 和 i的指令執行過程,知道的其實也沒啥難的,不知道的估計也說不出為什麼兩個賦值結果不一樣。跟大夥分享分享我的理解。首先要知道虛擬機器棧是什麼?虛擬機器棧裡都有什麼?此知識點要掌握關於虛擬機器棧中的運算元棧 以下用操作棧代替 和區域性變數表 以下用區域性表代替 還有...

對i 與 i的分析

標籤 c語言 i i by 小威威 1 單獨使用 i 與 i單獨作為乙個語句使用時,即 i i 二者是等價的,並沒有什麼爭議,相當於語句 i 1 2 賦值使用 首先,i 與 i有什麼本質區別呢?i 指先取出i,再進行i 1操作 i指先進行i 1,再取出i。i 與 i賦值使用時,即 a i a i 此...