有關jvm的一些詳細內容我就不在贅述,那麼到底i++和++i的區別體現在**呢?
從位元組碼上來看,i++是iload,iinc,而++i是iinc,iload;
iload是從區域性變數表中載入int型別的資料到操作棧中;通過上述的位元組碼就可以看出,我們平日所說的i++是先賦值再自增,而++i是先自增再賦值.iinc是int變數的增值變化,是在
區域性變數表
中自增的istore是將操作棧頂的int型別的值彈出,並存入到區域性變數表
偽**:
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...