如何理解int i=1;i=i++;

如何理解int i=1;i=i++;

1、引入兩個概念:局部變量表操作數棧

棧幀(Stack Frame):

是用於支持虛擬機進行方法調用和方法執行的數據結構,它是虛擬機運行時數據區的虛擬機棧(Virtual Machine Stack)的棧元素。棧幀存儲了方法的局部變量表,操作數棧,動態連接和方法返回地址等信息。第一個方法從調用開始到執行完成,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。

每一個棧幀都包括了局部變量表,操作數棧,動態連接,方法返回地址和一些額外的附加信息。在編譯代碼的時候,棧幀中需要多大的局部變量表,多深的操作數棧 都已經完全確定了,並且寫入到了方法表的Code屬性中,因此一個棧幀需要分配多少內存,不會受到程序運行期變量數據的影響,而僅僅取決於具體虛擬機的實 現

java局部變量表:

是棧幀重要組中部分之一。他主要保存函數的參數以及局部的變量信息。局部變量表中的變量作用域是當前調用的函數。函數調用結束後,隨着函數棧幀的銷燬。局部變量表也會隨之銷燬,釋放空間。

操作數棧:

與局部變量表一樣,均以字長爲單位的數組。不過局部變量表用的是索引,操作數棧是彈棧/壓棧來訪問。操作數棧可理解爲java虛擬機棧中的一個用於計算的臨時數據存儲區。

存儲的數據與局部變量表一致含int、long、float、double、reference、returnType,操作數棧中byte、short、char壓棧前(bipush)會被轉爲int。

數據運算的地方,大多數指令都在操作數棧彈棧運算,然後結果壓棧。

java虛擬機棧是方法調用和執行的空間,每個方法會封裝成一個棧幀壓入佔中。其中裏面的操作數棧用於進行運算,當前線程只有當前執行的方法纔會在操作數棧中調用指令(可見java虛擬機棧的指令主要取於操作數棧)。

2、對=賦值運算符的理解

操作數棧彈棧賦值給局部變量表的變量

3、理解int i=1;i=i++;

對於int i=1;  

局部變量表生成標識爲i的變量,操作數棧將1壓棧,=右邊運算已結束,操作數棧將1彈棧,通過=賦值給局部變量表的i變量。

對於i=i++;

i還是局部變量存在的,

i++意思是操作數棧將局部變量表i變量的值壓棧,操作數棧棧頂元素是1;之後對局部變量表i變量的值自增變爲2;(=右邊運算已結束)最後操作數棧將棧頂元素1彈棧,通過=賦值給局部變量表的i變量,此時局部變量表變量i的值爲1

綜上int i=1;i=i++;此時i=1

補充:

int i=1;i=++i;

對於i=++i;

是先對局部變量表中i變量進行自增,局部變量表中i變量的值爲2;操作數棧將局部變量表i變量的值(2)壓棧,操作數棧棧頂元素是2;(=右邊運算已結束)最後操作數棧將棧頂元素2彈棧,通過=賦值給局部變量表的i變量,此時局部變量表變量i的值爲2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章