2014-10-10 139 views
1

我被告知a + = b;和a = a + b;這可能導致其中只有一個是合法的,取決於類型的刪減。Java中a + = b和a = a + b的區別

有沒有人有這樣的例子?

+0

[this](http://stackoverflow.com/questions/19957085/why-are-arithmetic-assignment-operators-more-efficient)可能會幫助你 – 2014-10-10 10:17:57

+0

謝謝!這就是我正在尋找的東西,例如將'a'聲明爲byte,將'b'聲明爲int將導致a = a + b是非法的,並且a + b是合法的。 – mmgro27 2014-10-10 10:25:06

回答

6

基本上沒有什麼區別,但是還是有細微差別的。

算術賦值運算符執行隱式轉換。例如

byte a = 1; 
int b = 2; 

a += b; // compiles 
a = a + b; // doesn't compile as a byte + int = int 
a = (byte) (a + b); // compiles as this is the same as += 

更多奇怪的例子。

int a = 5; 
a += 1.5f; 
// a == 6 

char ch = '0'; // (char) 49 
ch *= 1.1;  // ch = '4'; 

long l = Integer.MAX_VALUE; 
l += 0.0f; // i = (long) ((long) l + 0.0f) 
// i == Integer.MAX_VALUE + 1L; WTF!? 
// l is no longer Integer.MAX_VALUE due to rounding error. 
-1
int a = 10; 
int b = 20; 
a=a+b; // 30 

a+=b; // 30 

System.out.println(a); 

兩者都會給出相同的答案。

1

的JLS(部分15.26.2)表示:

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

類型轉換的存在意味着存在幾個邊緣情況,其中a = a op b意味着與a op= b不同。

請參閱Peter Lawrey的答案舉一個例子。當abytebint而「op」是+。 「gotcha」是a + b產生一個int,然後不能被分配到a ...沒有類型轉換。

對於ab以及其他算術運算符和位運算符,其他類型也適用同樣的場景。

相關問題