我做了一些小測試來操縱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
,但什麼是這兩個代碼之間的區別?
我做了一些小測試來操縱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
,但什麼是這兩個代碼之間的區別?
你是對的short
被提升爲ints
。這發生在對二進制運算符+
的評估期間,它被稱爲二進制數字提升。
但是,使用複合賦值運算符(如+=
)可以有效地將其擦除。 Section 15.26.2 of the JLS狀態:
形式E1 OP的化合物賦值表達式= E2相當於E1 =(T)((E1)OP(E2)),其中T是E1的類型,不同的是E1是隻評估一次。
也就是說,它相當於回到short
。
我比你喜歡你的答案比起來投票,我刪除了我的,好工作。 –
@帕特里克:複合分配有另一種方式。顯然'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'相同。 –
可能重複的[Java + =運算符](http://stackoverflow.com/questions/8710619/java-operator) – Raedwald