当前位置: 首页 > 面试题库 >

Java中&=和| =会短路吗?

赫连秦迟
2023-03-14
问题内容

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

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

我意识到我可以编写一个测试,但是有人可能对此一无所知,而其他人可能会找到有用的答案。


问题答案:

不,|=&=没有短路,因为它们的复合赋值版本&|等不短路。

[JLS

15.26.2复合赋值运算符](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#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(逻辑运算符&|)相比,他们的boolean条件同行(&&||)之处在于前者不“短路”;
后者可以。也就是说,假设没有异常等:

  • &| 始终 评估两个操作数
  • &&有条件地||评估正确的操作数; 仅当右操作数的值可能影响二进制运算的结果时,才对右操作数进行求值。这意味着在以下情况下不会评估正确的操作数: __
    • 的左操作数&&计算为false
    • (因为无论正确的操作数求值是什么,整个表达式都是false
    • 的左操作数||计算为true
    • (因为无论正确的操作数求值是什么,整个表达式都是true

参考文献

  • JLS 15.22.2布尔逻辑运算符&^|
  • JLS 15.23条件与运算符 &&
  • JLS 15.24条件或运算符 ||


 类似资料:
  • 问题内容: 阅读了有关Java 8的一些知识后,我进入了这篇博客文章,解释了有关流及其还原的一些知识,以及何时有可能使还原短路。在底部,它指出: 请注意,在或的情况下,我们只需要与谓词匹配的第一个值(尽管不能保证返回第一个)。但是,如果流没有排序,则我们的行为应类似于。的操作,并且可能不会短路,因为在所有它的流可能需要评估所有的值,以确定操作者是否是或。因此,使用它们的无限流可能不会终止。 我知道

  • 哪个集合是短路的,复杂条件表达式是短路的确切含义是什么?

  • 问题内容: 我想知道是否有人可以解释什么是短路,也许是在简单的Java程序中使用的一个例子。谢谢你的帮助! 问题答案: 短路是确定结果后立即停止对表达式求值的地方。因此,例如: 如果为,则并且根本不会进行评估,因为表达式的结果已经确定。如果为假,则被评估;如果是真的,则永远不会进行评估。这似乎没有什么区别,但请考虑: 如果返回true,那么与被从来没有所谓,因为表达式的结果已经确定。所以,如果还是

  • 问题内容: 哪一组短路,这到底意味着复杂的条件表达式短路了? 问题答案: 在与运营商“短路”,这意味着如果没有必要,他们不评价的右手边。 在与运营商,如逻辑运算符时,始终评估两侧。 每个操作员只有一种短路情况,它们是: -不必知道右侧是什么,结果必须是 -不必知道右侧是什么,结果必须是 让我们在一个简单的示例中比较行为: 第二个版本使用非短路运算符,并将抛出,但第一个版本将无例外地返回;

  • 本文向大家介绍java实现dijkstra最短路径寻路算法,包括了java实现dijkstra最短路径寻路算法的使用技巧和注意事项,需要的朋友参考一下 【引用】迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。  它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 基本思想 通过Dijkstra计算图G中的最短路径时,需要指

  • 当使用if, elsif, until或者使用and或or运算符测试条件while使用短路评估。 例如 - if a < 0 and b > 0 then -- block of code end if 如果<0为假,那么Euphoria并不打算测试b是否大于0.它知道总体结果是假的,无论如何。 同样 - if a < 0 or b > 0 then -- block of code