存在非短路逻辑运算符的原因

nam*_*olk 33 java logical-operators

当与使用boolean的操作数,&|成为逻辑每运营商的JLS第15.22.2.不像&&||,然而,这些不短路; 他们总是评估双方.我有一个愚蠢的问题:当我们拥有更高效的短路逻辑运算符(,)时&,为什么效率较低的非短路逻辑运算符(,|)仍然存在?我的意思是,与短路逻辑运算符相比,非短路逻辑运算符的实际用途是什么?换句话说,总是通过使用非短路逻辑运算符来评估双方的用法是什么?&&||

T.J*_*der 28

更新的答案:

道歉,我错过了这个词"逻辑"在你的问题,即使它在那里.(我冒昧地用编辑来强调它.)

考虑您希望始终发生任何副作用的情况,无论左手表达式是否评估truefalse.对比:

if (foo() & bar()) {
    // Only call this if both operations returned true
}
Run Code Online (Sandbox Code Playgroud)

if (foo() && bar()) {
    // Only call this if both operations returned true
}
Run Code Online (Sandbox Code Playgroud)

让我们假设两者foobar有我们的影响拥有无论发生foo退货truefalse.在上面的第一个,我知道bar将永远被调用,并有其效果.当然,后者bar可能会或可能不会被召唤.如果我们没有非短路版本,我们必须使用临时变量:

boolean fooResult, barResult;
fooResult = foo();
barResult = bar();
if (fooResult && barResult) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

你也许会说(我可能会),你应该这样做无论如何,因为它太容易误读if (foo() & bar()),但我们去,对于具有非短路版本务实的原因.

原始答案:

您如何建议&(或|)成为短路运营商?使用&&||,它是有道理的,因为你正在处理布尔条件:它们可以是真或假,没有灰色阴影.但是&|处理比特,而不是布尔值.结果是一个数字.我的意思是,&如果左侧是左侧,我想无法评估右侧,如果左侧是全部位,无论类型是什么0,同样|无法评估它,但我不是看到很多点使每个运算符的一个边缘情况显着(与254个或更多其他情况相比).

  • 在 Java 中 & 和 | 如果应用于布尔类型,则不适用于位。 (3认同)

pai*_*lee 13

在某些情况下,布尔表达式的组件涉及您希望在所有情况下执行的操作.请考虑以下检查密码有效性的示例:

while ( !password.isValid() & (attempts++ < MAX_ATTEMPTS) ) {

    // re-prompt

}
Run Code Online (Sandbox Code Playgroud)

如果由于短路而没有评估第二个条件,则attempts永远不会增加.因此,启用了更高的程序员灵活性.

  • 但如果更改顺序,这也可以用`&&`写成:) (9认同)