换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会立即知道这一点,而其他人可能会发现答案很有用。
换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会立即知道这一点,而其他人可能会发现答案很有用。
不,|=
并且&=
不要短路,因为它们是 and 的复合赋值版本,&
不会|
短路。
JLS 15.26.2 复合赋值运算符
形式的复合赋值表达式
E1 op= E2
等价于E1 = (T)((E1) op (E2))
,其中T
是 的类型E1
,除了E1
只计算一次。
因此,假设boolean &
,等价于isFoobared &= methodWithSideEffects()
:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
另一方面&&
,||
做短路,但莫名其妙地Java没有他们的复合赋值版本。也就是说,Java 既没有&&=
也没有||=
.
boolean
逻辑运算符 ( &
and |
) 与boolean
条件运算符 ( &&
and )的区别在于||
前者不会“短路”;后者做。也就是说,假设没有例外等:
&
并|
始终评估两个操作数&&
并有条件||
地评估右操作数;只有当右操作数的值会影响二元运算的结果时,才会计算右操作数。这意味着在以下情况下不评估右操作数:
&&
计算为false
false
)||
计算为true
true
)不,他们没有,因为x &= y
是x = x & y
和x |= y
的缩写x = x | y
。Java 没有&&=
or||=
运算符可以做你想做的事。
和运算符(与, , , , 和&
一起)是按位运算符。对于任何整数类型,该表达式将执行按位与运算。同样,执行按位或。要执行按位运算,数字中的每个位都被视为布尔值,带有指示和指示。因此,, 因为是二进制的并且是。同样,。 维基百科对不同的运算符有很好的完整解释。现在,对于布尔值,我认为|
~
^
<<
>>
>>>
x & y
|
1
true
0
false
3 & 2 == 2
3
0...011
2
0...010
3 | 2 == 3
您可以将&
and|
用作and 的非短路等效项&&
,||
但我无法想象您为什么要这样做。