從jvm棧幀中區別i 和 i

2021-08-29 20:39:11 字數 1067 閱讀 2753

有關jvm的一些詳細內容我就不在贅述,那麼到底i++和++i的區別體現在**呢?

從位元組碼上來看,i++是iload,iinc,而++i是iinc,iload;

iload是從區域性變數表中載入int型別的資料到操作棧中;

iinc是int變數的增值變化,是在區域性變數表中自增的

istore是將操作棧頂的int型別的值彈出,並存入到區域性變數表

通過上述的位元組碼就可以看出,我們平日所說的i++是先賦值再自增,而++i是先自增再賦值.

偽**:

int i = 0;

i = i++;// 此處的位元組碼可以翻譯為iload,iinc,istore

/* iload:從區域性變數表中載入數字'0'到操作棧中

innc:代表了區域性變數表中的變數進行自增操作,此時區域性變數表中i=1

istore:將此時操作棧頂的值(0)彈出,存入區域性變數表中,並將剛剛自增的值覆蓋掉

*/ i = ++i;// 此處的位元組碼iinc,iload,istore

/* innc:代表了區域性變數表中的變數進行自增操作,此時區域性變數表中i=1

iload:從區域性變數表中載入數字'1到操作棧中

istore:將此時操作棧頂的值(1)彈出,存入區域性變數表中,並將區域性變數表中值覆蓋掉

*/

雖然道理比較淺顯,也是很容易懂的,但是通過這個過程讓我知道一些東西,比如:位元組碼的翻譯順序是=右邊先於左邊.後續朋友出了乙個題也讓我加深了理解了這個過程.**如下

int i = 1;

i = i++ + ++i + i++ + ++i ;

system.out.println(i);

有興趣的朋友可以嘗試一下,可能個人理解的稍有不對,就關於那個iinc在區域性變數表中我個人就表示質疑(真是在區域性變數表中麼?在表中如何操作的?)歡迎指正.

JVM角度分析i 和 i的區別

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

i和i 的區別

大家都應該知道i 和 i的區別,前者是先使用i的值,然後再增加1,而後者是先增加1然後再使用i的值。但是i 和 i那個更好呢?我們實現角度來看 前者是將i值加1後賦給i,然後返回i本身 而後者是先用個臨時變數儲存i值,然後將i值加1賦給i,然後返回臨時變數的值。內建資料型別他們的效率差不多,看他們的...

i 和 i的區別

當年上c 課的時候對於i 和 i的區別就稀里糊塗。後來沒注意也沒出過什麼問題。但是這個問題還是應該搞清楚。假如有乙個vector,值為 1,2,3,4,5,6,7 用以下程式輸出 i 0 while i 7 i 0 while i 7 cout beforei v i endl cout befor...