换句话说,下面这两个语句的行为是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我知道我可以自己编写测试,但有人可能会直接知道答案,而其他人也可能会发现这个答案很有用。
换句话说,下面这两个语句的行为是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我知道我可以自己编写测试,但有人可能会直接知道答案,而其他人也可能会发现这个答案很有用。
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
另一方面,&&
和||
会进行短路计算,但令人费解的是Java没有它们的复合赋值版本。也就是说,Java既没有&&=
也没有||=
。
boolean
逻辑运算符(&
和|
)与它们的条件运算符(&&
和||
)之间的区别在于,前者不会"短路",而后者会。也就是说,在没有异常等情况下:
&
和|
总是评估两个操作数&&
和||
有条件地评估右操作数;只有当其值可能影响二元操作的结果时,才会评估右操作数。这意味着当左操作数为以下情况时,不会评估右操作数:
&&
的左操作数评估为false
false
)||
的左操作数评估为true
true
)x &= y
缩写为x = x&y
,x |= y
缩写为x = x | y
。Java没有&&=
或||=
运算符可以实现您想要的功能。
&
和|
运算符(以及~
,^
,<<
,>>
和>>>
)是按位运算符。 对于任何整数类型,表达式x & y
将执行按位与操作。 同样,|
执行按位或操作。 要执行按位操作,数字中的每个位都被视为布尔值,其中1
表示true
,0
表示false
。 因此,3 & 2 == 2
,因为3
在二进制中是0...011
,而2
是0...010
。 类似地,3 | 2 == 3
。 Wikipedia有一个完整的不错解释不同的运算符。 现在,对于布尔值,我认为您可以使用&
和|
作为非短路&&
和||
的等效项,但无论如何我都想象不出为什么您会想这么做。
True和False
。这是8个情况中仅有的1种情况,可以让赋值部分有用。在另外7个情况下,结果不需要改变,所以没有必要。当然,|和&符号是有意义的,因为你也可以将它们用于位或/与,从而执行一些有用的操作。 - Wayne Werner