2013-05-08 65 views
2

我經常使用兩種形式:java中的加法運算符(也包括減法運算,乘法運算等)。我認爲這不會影響性能或速度,但我對這些問題感到困惑:「爲什麼Java創建者提供了這種操作符的兩種形式?它們之間有什麼區別?」那麼,什麼是兩種形式之間的真正區別:java中的運算符:'+'with'='vs'+ ='

int a = 10, b = 3; 
b = b + a; 

int a = 10, b = 3; 
b += a; 

有人可以解釋我這個?可能兩種形式之間的區別是隱藏在較低的層次上?每本書只說:「Java也有複合運營商......」但沒有區別。

+0

那是因爲沒有區別。 – 2013-05-08 09:46:03

+0

@StefanPante。不,有區別。 – 2013-05-08 10:03:05

+0

[Java + =運算符]的可能的重複(http://stackoverflow.com/questions/8710619/java-operator) – Panther 2015-10-02 04:23:08

回答

0

這個問題真的很老。但是,我想總結:我在 Java Language specification下一文本中找到:

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

所以,它足夠了解!

3

它沒有提到任何差異,因爲程序員的觀點沒有。

b = c + a; 

表示法存在,因爲它是一個加法的正常情況。短格式

b += a; 

存在的特殊情況c「是」 b,真正擴展到

b = b + a; 
+2

請注意,例如,如果b是「byte」,而a是「int」。 'b = b + a;'不會編譯,但'b + = a;'會編譯,因爲它等於'b =(byte)(b + a);'。當您使用複合運算符時,總會有一個隱式轉換。在這種情況下,'b + = a'等價於'(int)(b + a);'而不是'b = b + a;' – 2013-05-08 09:51:35

1

一個較短,僅此而已。

0

在這兩個聲明中實際上沒有任何區別。

b += a內部將僅被視爲b = b + a

0

基本上沒有區別。 +=只是爲了您的方便。

2

區別在於,在第一種情況下,創建了一個臨時對象c = (a + b),然後將其分配回b。在第二種情況下,操作發生在位,應該更有效率。

至少,這個曾經是舊的C++:現代編譯器和JIT會自動檢測和優化這個,所以實際上沒有任何區別。

0

Add AND assignment運營商,它增加了右操作數左操作數,然後將結果以左操作數B += A相當於B = B + A

0

到目前爲止,我只找到與邏輯複合運算符的差異:

boolean accepted = firstCheck(); 

version 1: accepted = accepted && secondCheck(); 
version 2: accepted &= secondCheck(); 

以上代碼的行爲將有所不同:

版本1將忽略調用secondCheck()如果接受爲false

版本2將永遠呼叫secondCheck()

0

這些是他們隱藏在較低層次上沒有區別。 b += a相當於b = b + a。 但是,這裏有一些危險。看起來b += a是一個原子操作,但它首先讀取b,然後讀取a,然後將它們相加,然後將結果寫入b。在處理併發操作時將其視爲原子操作可能會導致錯誤。換句話說,在併發環境中使用這個較短的+=運算符時,總是要記住提供一些明確的鎖定。

8

考慮下面的代碼:

int x = 9; 
short s = 2; 
s = s+x; // Compiler error 
s += x; // Compiles 

所以,基本上,當你說:s += x這意味着s = (short)(s+x)。當你使用s = s+x時,編譯器會抱怨,因爲它不能隱含地從intshortx。所以,+=運營商負責類型轉換。

+0

當您執行s + = x;'s does's = (短)(s + x);' – 2013-05-08 10:53:05

+0

@鄒鄒感謝您的糾正。 :) – 2013-05-08 11:12:54

0

另一種問自己同樣問題的方法是java.lang.StringString有什麼區別?所不同的是巨大的在源代碼的全部內容方面:表現力和可讀性。

+0

你是不對的!您可以閱讀由@RahulBobhate發佈的第一個答案。 – 2013-05-08 12:11:39