【问题标题】:Do &= and |= short-circuit in Java?在 Java 中 &= 和 |= 会短路吗?
【发布时间】:2011-03-10 07:04:29
【问题描述】:

换句话说,以下两个语句的行为方式是否相同?

isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();

我意识到我可以写一个测试,但有人可能会立即知道这一点,而其他人可能会觉得答案很有用。

【问题讨论】:

    标签: java short-circuiting


    【解决方案1】:

    不,|=&= 不会短路,因为它们是 &| 的复合赋值版本,不会短路。

    JLS 15.26.2 Compound Assignment Operators

    E1 op= E2 形式的复合赋值表达式等价于E1 = (T)((E1) op (E2)),其中TE1 的类型,但E1 只计算一次。

    因此,假设boolean &isFoobared &= methodWithSideEffects() 等价于:

    isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
    

    另一方面,&&|| 会短路,但令人费解的是,Java 没有针对它们的复合赋值版本。也就是说,Java既没有&&=也没有||=

    另见


    这到底是什么短路业务?

    boolean 逻辑运算符(&|)与其对应的 boolean 条件运算符(&&||)之间的区别在于前者不会“短路”;后者做。也就是说,假设没有例外等:

    • &| 总是评估两个操作数
    • &&||有条件地评估右操作数;只有当右操作数的值会影响二元运算的结果时,才会计算右操作数。这意味着在以下情况下不评估右操作数:
      • && 的左操作数计算结果为 false
        • (因为无论右操作数计算为什么,整个表达式都是false
      • || 的左操作数计算结果为 true
        • (因为无论右操作数计算为什么,整个表达式都是true

    参考文献

    【讨论】:

    • 我不认为这是莫名其妙的......事实上,现在我想想它们几乎完全没用。 only 值在赋值后会改变是True and False。这是使分配部分有用的 8 个案例中的 1 个。在其他 7 种情况下,不需要结果,因为它不会改变。当然是 | and & 是有意义的,因为您也可以将它们用于按位或/和,从而执行一些有用的操作。
    • 我也觉得可以解释。并不是说我可以,嗯,确切地解释它,但我确实倾向于从右到左阅读赋值语句(首先这样做,然后对结果做一些事情)所以如果 LHS 神奇地使我会感到非常惊讶RHS 不执行。
    【解决方案2】:

    不,他们没有,因为x &= yx = x & y 的缩写,而x |= yx = x | y 的缩写。 Java 没有 &&=||= 运算符可以满足您的需求。

    &| 运算符(以及 ~^<<>>>>>)是 bitwise operators。对于 any 整数类型,表达式x & y 将执行 按位 和运算。同样,| 执行按位或。要执行按位运算,数字中的每个位都被视为布尔值,1 表示true0 表示false。因此,3 & 2 == 2,因为3 在二进制中是0...011,而20...010。同样,3 | 2 == 3Wikipedia 对不同的运算符有很好的完整解释。现在,对于布尔值,我认为您可以使用&| 作为&&||非短路 等效项,但我无法想象你为什么要这样做。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2011-04-03
      • 2011-04-12
      • 2013-12-18
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      相关资源
      最近更新 更多