2012-03-06 52 views
4

今天在幫助某人時,我遇到了一個我無法理解的原因。 雖然使用+ =我們不需要顯式投射,但是當我們使用i + i時,我們需要明確投射。找不到確切的原因。任何輸入將不勝感激。關於字節添加和賦值的有趣觀察

public class Test{ 
     byte c = 2; 
     byte d = 5; 

     public void test(String args[]) 
     { 
      c += 2; 
      d = (byte) (d + 3); 
     } 
    } 

回答

8

Java的定義使+ =和其他複合賦值操作符自動將結果轉換爲正在更新的變量的類型。因此,使用+ =時不需要強制轉換,儘管在使用正常操作符時這是必需的。您可以在Java語言規範在http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

具體看到這一點,表達

a op= b 

是相當於

(a = (type of a)((a) op (b)); 

希望這有助於!

+0

感謝您的快速反應,您可以提供任何官方參考,如果有的話? – kosa 2012-03-06 05:46:42

+0

我剛剛更新了正式參考答案。希望它是有用的! – templatetypedef 2012-03-06 05:47:50

+0

完全有道理。謝謝! – kosa 2012-03-06 05:50:58

1

從Java Language Spec, Chapter 15

[..]的二進制運算的結果(注:(c+2)在我們的例子中,這導致int類型值)被轉換爲的類型左側變量(注意:在我們的示例中爲byte,將值集轉換(第5.1.13節)轉換爲適當的標準值集(不是擴展指數值集),並且轉換的結果是存儲到變量中。

+0

謝謝!得到它了。 – kosa 2012-03-06 06:36:58