x=x+1最低,因爲它的執行如下。
(1)讀取右x的地址;
(2)x+1;
(3)讀取左x的地址;
(4)將右值傳給左邊的x(編譯器並不認爲左右x的地址相同)。
x+=1其次,它的執行如下。
(1)讀取x的地址;
(2)x+1;
(3)將得到的值傳給x(因爲x的地址已經讀出)。
x++最高,它的執行如下。
(1)讀取右x的地址;
(2)x自增1.
i=i+1和i+=1完全等價嗎?
可能有很多程序員認爲i+=1只是i=i+1的簡寫方式,其實不然,它們一個使用簡單賦值運算,一個使用複合賦值運算,而 簡單賦值運算和複合賦值運算的最大差別就在於:複合賦值運算符會自動地將運算結果轉型爲其左操作數的類型。看看以下的兩種寫法,你就知道它們的差別在哪兒 了:
(1) byte i=5;
i+=1;
(2) byte i=5;
i=i+1;
第一種寫法編譯沒問題,而第二種寫法卻編譯通不過。原因就在於,當使用複合賦值運算符進行操作時,即使右邊算出的結果是int類型,系統也會將其值轉化爲 左邊的byte類型,而使用簡單賦值運算時沒有這樣的優待,系統會認爲將i+1的值賦給i是將int類型賦給byte,所以要求強制轉換。理解了這一點 後,我們再來看一個例子:
byte b=120;
b+=20;
System.out.println("b="+b);
說到這裏你應該明白了,上例中輸出b的值不是140,而是-116。因爲120+20的值已經超出了一個byte表示的範圍,而當我們使用複合賦值運 算時系統會自動作類型的轉化,將140強轉成byte,所以得到是-116。由此可見,在使用複合賦值運算符時還得小心,因爲這種類型轉換是在不知不覺中 進行的,所以得到的結果就有可能和你的預想不一樣。