2010-10-11 72 views
106

假設Java&=運算符是否應用&或&&?

boolean a = false; 

我在想,如果這樣做的:

a &= b; 

相當於

a = a && b; //logical AND, a is false hence b is not evaluated. 

或在另一方面,它意味着

a = a & b; //Bitwise AND. Both a and b are evaluated. 

回答

111

從Java語言規範 - 15.26.2 Compound Assignment Operators

形式E1 op= E2的化合物賦值表達式是等效於E1 = (T)((E1) op (E2)),其中TE1類型,不同之處在於E1只計算一次。

所以a &= b;相當於a = a & b;

(在某些用途中,類型轉換,使該結果的差異,但在這一個b必須是boolean和類型,投什麼都不做。)


在實踐中,有a = a & b;a = a && b;之間的差異很小。如果b是一個變量或一個常數,那麼兩個版本的結果都是一樣的。當b的評估可能有副作用時,只有語義上的差異;即當它是一個不平凡的子表達式時。

在性能方面,權衡是評估b的成本與a價值的測試和分支的成本之間的平衡,以及避免不必要地分配給a的潛在節省。分析並不是直截了當的,但除非計算成本b不重要,否則兩個版本之間潛在的性能差異可能太小而不值得考慮。

19

這是最後一個:

a = a & b; 
30

參見15.22.2 of the JLS。對於布爾操作數,&運算符是布爾值,而不是按位。對於布爾操作數,&&&之間的唯一區別是對於&&它是短路的(意思是如果第一個操作數評估爲false,則不評估第二個操作數)。

你的情況

所以,如果b是一種原始的,a = a && ba = a & b,並a &= b都做同樣的事情。

+1

所以(一&= b;)將於如果b是一個方法調用沒有短路?有沒有像「&& =」運算符? – is7s 2012-04-25 18:34:20

+1

正確。 b()被調用。沒有&& =運算符。 – stew 2012-04-25 18:45:52

+1

看來這不能回答這個問題; OP已經知道短路。 – 2012-11-15 07:58:41

0

我遇到了類似的情況使用布爾值,我想避免調用b()如果a已經是假的。

這爲我工作:

a &= a && b() 
+21

爲了避免冗餘(仍然允許短路),您可以簡單地寫'a = a && b()'。 – 2012-09-08 09:39:24