弄懂Java的自增變數
首先我們來看一段程式碼:
public static void main(String[] args){
int i = 1;
i = i++; //第一行
int j = i++; //第二行
int k = i + ++i * i++; //第三行
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}
大家可以先不要看下面的答案,寫出自己的答案。
分析
在進行講解前,我們先講解一些基本的概念來幫助我們下面的分析。
概念
首先我們要知道普通我們的語句是如何執行的。
比如i = a + b * c
,我們設i = 0
, a
為1
,b
為2
,c
為3
。
在進行運行時,左邊的i是保存在局部變數中,也就是保存在棧中;而右邊的計算是在操作數棧中進行計算的。
在進行右邊操作數棧計算完畢後,會將結果賦值給左邊對應的局部變數。
第一步
在進行i = i ++
進行計算時,會將左邊的放進局部變數,右邊的i++
放進操作數棧,然後進行計算。
此時計算i++
,i++
操作等於 i = i + 1
,所以加1
後賦值給局部變數,而操作數棧仍未1
。
將操作數棧的1
賦值給局部變數,所以這一步計算完之後結果仍未1
。
第二步
此時局部變數中i的值為1
,現將i放進操作數棧,然後計算i++
。
計算完i++
之後,局部變數中的i
為2
,操作數棧的結果為1
。
然後將操作數棧中的值賦值給j
。
第三步
在進行計算之前,i
的值為2
,j
的值為1
。
右邊的三個數字分別要壓入操作數棧,分別是i
,++i
,i++
。
i
直接放入是2
;++i
要進行計算,計算後局部變數中的i
是3
,因為是++i
,所以放入的也是3
;i++
先放入3
,然後計算i++
,此時局部變數表中i
的值為4
。
將前一步操作數棧的值計算完之後放入k
中即可。
總結
- 賦值=,最後計算
- =右邊的從左到右載入值依次壓入操作數棧
- 實際先算哪個,看運算符優先順序
- 自增、自減操作都是直接修改變數的值,不經過操作數棧
- 最後的賦值之前,臨時結果也是存儲在操作數棧中