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.
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.
從Java語言規範 - 15.26.2 Compound Assignment Operators。
形式
E1 op= E2
的化合物賦值表達式是等效於E1 = (T)((E1) op (E2))
,其中T
是E1
類型,不同之處在於E1
只計算一次。
所以a &= b;
相當於a = a & b;
。
(在某些用途中,類型轉換,使該結果的差異,但在這一個b
必須是boolean
和類型,投什麼都不做。)
在實踐中,有a = a & b;
和a = a && b;
之間的差異很小。如果b
是一個變量或一個常數,那麼兩個版本的結果都是一樣的。當b
的評估可能有副作用時,只有語義上的差異;即當它是一個不平凡的子表達式時。
在性能方面,權衡是評估b
的成本與a
價值的測試和分支的成本之間的平衡,以及避免不必要地分配給a
的潛在節省。分析並不是直截了當的,但除非計算成本b
不重要,否則兩個版本之間潛在的性能差異可能太小而不值得考慮。
這是最後一個:
a = a & b;
參見15.22.2 of the JLS。對於布爾操作數,&
運算符是布爾值,而不是按位。對於布爾操作數,&&
和&
之間的唯一區別是對於&&
它是短路的(意思是如果第一個操作數評估爲false,則不評估第二個操作數)。
所以,如果b
是一種原始的,a = a && b
,a = a & b
,並a &= b
都做同樣的事情。
我遇到了類似的情況使用布爾值,我想避免調用b()如果a已經是假的。
這爲我工作:
a &= a && b()
爲了避免冗餘(仍然允許短路),您可以簡單地寫'a = a && b()'。 – 2012-09-08 09:39:24
所以(一&= b;)將於如果b是一個方法調用沒有短路?有沒有像「&& =」運算符? – is7s 2012-04-25 18:34:20
正確。 b()被調用。沒有&& =運算符。 – stew 2012-04-25 18:45:52
看來這不能回答這個問題; OP已經知道短路。 – 2012-11-15 07:58:41