2014-01-23 140 views
9

我做了一些小測試來操縱short,我遇到了一個編譯問題。 下面的代碼編譯:s = s + s和s + = s之間的區別短

short s = 1; 
s += s; 

而這一次沒有:

short s = 1; 
s = s + s; //Cannot convert from int to short 

我讀過shorts將自動晉升爲int,但什麼是這兩個代碼之間的區別?

+0

可能重複的[Java + =運算符](http://stackoverflow.com/questions/8710619/java-operator) – Raedwald

回答

17

你是對的short被提升爲ints。這發生在對二進制運算符+的評估期間,它被稱爲二進制數字提升

但是,使用複合賦值運算符(如+=)可以有效地將其擦除。 Section 15.26.2 of the JLS狀態:

形式E1 OP的化合物賦值表達式= E2相當於E1 =(T)((E1)OP(E2)),其中T是E1的類型,不同的是E1是隻評估一次。

也就是說,它相當於回到short

+0

我比你喜歡你的答案比起來投票,我刪除了我的,好工作。 –

+1

@帕特里克:複合分配有另一種方式。顯然'x * = y + z;'並不意味着'x = x * y + z;'而是'x = x *(y + z);'。那麼,'+'也是如此。 「x + = y + z」表示「x = x +(y + z)」,而不是「x = x + y + z」。在這種方式下使用'+ ='時,右邊的加法在*左邊的加法之前發生。在代數加法是聯想性和交換性的,但計算機數學可能會違反這些性質。 'x + = y + z'的結果不需要與'x = x + y + z'相同。 –

相關問題