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

2022-09-01 02:39:27

当与操作数一起使用时,并成为 JLS 第 15.22.2 节的逻辑运算符。与 和 不同,但是,这些不会短路;他们总是评估双方。我有一个愚蠢的问题:当我们有效率更高的短路逻辑运算符(,)时,为什么效率较低的非短路逻辑运算符(,)仍然存在?我的意思是,与短路逻辑运算符相比,非短路逻辑运算符的真正用法是什么?换句话说,总是使用非短路逻辑运算符来评估双方的用法是什么?boolean&|&&||&|&&||


答案 1

更新的答案

抱歉,我错过了你问题中的“逻辑”这个词,即使它在那里。(我冒昧地通过编辑强调了这一点。

请考虑您希望始终发生任何副作用的情况,无论左侧表达式的计算结果是否为 。例如,对比度:truefalse

if (foo() & bar()) {
    // Only call this if both operations returned true
}

if (foo() && bar()) {
    // Only call this if both operations returned true
}

让我们假设两者兼而有之,并且无论回报还是..,我们都希望有效果发生。在上面的第一个中,我知道它总是会被调用并产生效果。当然,在后者中,可能会或可能不会被调用。如果我们没有非短路版本,我们将不得不使用临时变量:foobarfootruefalsebarbar

boolean fooResult, barResult;
fooResult = foo();
barResult = bar();
if (fooResult && barResult) {
    // ...
}

你可能会争辩说(我可能会)你应该这样做,因为它太容易被误读了,但是我们去了,这是拥有非短路版本的一个务实的理由。if (foo() & bar())

原答

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


答案 2

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

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

    // re-prompt

}

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


推荐