java - 在 Java 中 &= 和 |= 会短路吗?

标签 java short-circuiting

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

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

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

最佳答案

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

JLS 15.26.2 Compound Assignment Operators

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

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

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

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

另见


这到底是什么短路业务?

boolean 逻辑运算符(&|)与其对应的 boolean 条件运算符( &&||) 是前者不“短路”;后者做。也就是说,假设没有异常(exception)等:

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

引用文献

关于java - 在 Java 中 &= 和 |= 会短路吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3152208/

相关文章:

java - 比较包含对象列表的同一类的两个对象

java - 设置 setSkipFirstHeader(true) 时,iText 5.5.3 PdfPTable.keepRowsTogether() 无法按预期工作

c - () 的优先级最高,为什么会短路?

java - Oracle 数据库的 SSDT 等价物

java - 在eclipse上运行tomcat时出现404错误

java - 使用 AspectJ 配置 SpringSource 工具套件

ruby-on-rails - 为什么 `a.is_a? Array && !a.empty?` 引发 NoMethodError?

java - 为什么 Java 没有条件与和条件或运算符的复合赋值版本? (&&=, ||=)

c# - 用于比较值类型的短路运算符的.Net 性能?

Python - 短路奇怪的行为