對於i++和++i主要是需要需要弄清楚局部變量表和操作數棧的作用,運算過程中數據是怎麼保存的。
先可以簡單理解爲:
i++是先使用值在加1(先將局部變量表的數據寫入到操作數棧後,再局部變量表加1)
++i是先加1再使用(先局部變量表加1,再將局部變量表的數據寫入到操作數棧)
=是賦值操作,是運算的最後一步,是直接從操作數棧計算好值後,覆蓋到局部變量表,就是我們最後的結果
下面舉幾個例子幫助理解:
例一
public static void main(String[] args) {
int i = 1;
i = i++;
int j = 1;
i = i++;
System.out.println("i=" + i);
System.out.println("j=" + j);
}
結果:
i=1
j=2
i=1解釋
int i = 1; 將1放入局部變量表。此時棧=null,變量表=1,
i = i++;;++在後面,先將局部變量表的數據寫入到操作數棧後,再局部變量表加1。此時棧=1,變量表=2,然後賦值(=)操作,將棧覆蓋到變量表,此時棧=1,變量表=1,結果是1
j=2解釋
int j = 1;將1放入局部變量表。此時變量表=1,棧=null
i = i++;++在後面,先局部變量表加1,再將局部變量表的數據寫入到操作數棧。此時棧=2,變量表=2,然後賦值(=)操作,將棧覆蓋到變量表,此時棧=2,變量表=2,結果是2
例二
public static void main(String[] args) {
int i = 2;
int m = i++ * ++i;
int j = 2;
int n = ++j * j++;
System.out.println("m=" + m);
System.out.println("n=" + n);
}
結果
m=8
n=9
m=8解釋
int i = 2; 將2放入局部變量表。此時棧=null,變量表=2
int m = i++ * ++i; 這個運算因爲有一個運算符乘(*)號,所以包括2個部分
- i++先將局部變量表的數據寫入到操作數棧後,再局部變量表加1。此時棧=2,變量表=3
- ++i先局部變量表加1,再將局部變量表的數據寫入到操作數棧。 此時棧=2&4,變量表=4
賦值(=)操作,將棧覆蓋到變量表,此時棧=8(2*4),變量表m=8,i=4,結果是8
n=9解釋
int j = 2;將2放入局部變量表。此時棧=null,變量表=2
int n = ++j * j++;這個運算因爲有一個運算符乘(*)號,所以包括2個部分
- ++j先局部變量表加1,再將局部變量表的數據寫入到操作數棧。 此時棧=3,變量表=3
- j++先將局部變量表的數據寫入到操作數棧後,再局部變量表加1。此時棧=3&3,變量表=4
賦值(=)操作,將棧覆蓋到變量表,此時棧=9(3*3),變量表n=9,j=4,結果是9
總結
局部變量表的數據從哪裏來?
數據初始化,int=1
賦值語句,從操作數棧覆蓋,i=
操作數棧的值從哪裏來?
從局部變量表獲取
賦值(=)操作的值從哪裏來
運算後的數據會寫入到局部變量表,最終的值就是局部變量表的值