如何理解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