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); ...
JavaSE面試題:自增變數
來源:https://runwsh.com/
- 代碼
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);
}
- 現在,讓我們逐行解釋這段代碼的執行
1.
int i = 1
;:創建整數變數 i 並將其初始化為1。(i=1;)2.
i = i++;
:這是一個有爭議的表達式。首先,它將 i 的當前值1壓棧到一個操作數棧中。然後,它將 i 自增1,這就使得變數i=2了,但右邊的操作數棧不是沒有後續的邏輯運算了,就會將之前壓到操作數棧的1賦值給i。所以,i 的值又變為了1。(i=1;)
如果是`i=++i`呢,就是入棧的時候就會將自增後的變數i壓入棧中,變數i2,使得出棧的時候也是為2了。
3.
int j = i++;
:將 i 的當前值1賦給 j,然後將 i 自增1。所以,j 的值是1,而 i 的值變為2。(i=2;j=1)4.
int k = i + ++i * i++;
:這是一個複雜的表達式。首先看右邊的表達式,操作數棧會先將i變數入棧;也就是2先入棧,這個時候往右走++i,是將i自增後的數壓入棧中,也就是3,然後再看下一個操作數是i++;記住一點的就是,++i壓入棧中是將i自增後壓入棧中;i++是將i變數壓入棧中;
,記住這個規則就是,繼續壓入棧中的數字是3 。所以現在的操作數棧中的數據從棧低到棧頂依次為:2->3->3;按照運算符操作順序先乘後加,2+3*3=11。
列印結果:
i=4
j=1
k=11
小結
-
- 賦值=,最後計算
-
- =右邊的從左到右載入值依次壓入操作數棧
-
- 實際先算哪個,看運算符優先順序
-
- 自增、自減操作都是直接修改變數的值,不經過操作數棧
-
- 最後的賦值之前,臨時結果也是存儲在操作數棧中
建議:《JVM虛擬機規範》關於指令的部分