2013-03-31 20 views
7

我遇到了以下驚人的行:的Java INT + =雙語法驚喜

int x = 7; 
x += 0.5; 

顯然是合法的語法!添加之後,x仍然是7,所以double被轉換爲一個int並舍入爲0,但是在代碼中沒有任何顯式轉換的情況下完成。有沒有人對此感到驚訝?這裏的基本原理是什麼?

編輯澄清我的問題:任何人都可以給出這個決定的好理由嗎?它讓我覺得這是一個糟糕的決定,需要在其他地方進行明確的投射,但是在語言中有這樣一個地方,你會默默地扔掉數據。我錯過了什麼嗎?

+0

有趣。我確信[JLS](http://docs.oracle.com/javase/specs/jls/se7/html/index.html)可以解決這個問題。你有沒有看過它,看看它說什麼? –

+0

@ Hovercraft:JLS給出了規範,但不是決定的理由,這正是我所要求的。 –

回答

12
x += 0.5; 

相當於:

x = (int) (x + 0.5) 

一般來說:

x += y相當於x = (type of x) (x + y)


參見15.26.2. Compound Assignment Operators

+0

我明白這一點。我驚訝的是編譯器允許它!在你的第二行,有一個明確的強制轉換,迫使程序員認識到他們可能會丟失一些信息。例如,x = x + .5不會編譯,但x + = .5會......奇怪,不是? –

+0

@EricLindauer根本不奇怪,'x + 0.5'產生一個double,而'(int)(x + 0.5)'是一個整數。 –

+2

我想我不清楚...我知道規範說這是它是如何工作的。我的問題是:爲什麼?任何人如何證明允許x + = .5,但不允許x = x + .5 ?!這對我來說似乎很瘋狂。 –

0

x += 0.5;x = (int) (x + 0.5);相同。

0

這是因爲複合賦值運算符把隱式轉換(自動施法): 所以

x+=0.5 => x =(int)(x + 0.5) => x = (int)(7.5) => x = 7 
+0

它有這樣做的好理由嗎? –

+1

@EricLindauer:如果'x'是一個'short',即使'y'也是如此,像'x = x + y;'這樣的語句在沒有明確的類型轉換的情況下將是非法的。因此,Java的行爲就像由任何複合算術賦值運算符計算的結果明確地類型化結果類型一樣,無論它在任何特定情況下是否有意義。 – supercat