换句话说,以下两个语句的行为方式是否相同?
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|1true0false3 & 2 == 230...01120...0103 | 2 == 3您可以将&and|用作and 的非短路等效项&&,||但我无法想象您为什么要这样做。