nam*_*olk 33 java logical-operators
当与使用boolean的操作数,&并|成为逻辑每运营商的JLS第15.22.2.不像&&及||,然而,这些不短路; 他们总是评估双方.我有一个愚蠢的问题:当我们拥有更高效的短路逻辑运算符(,)时&,为什么效率较低的非短路逻辑运算符(,|)仍然存在?我的意思是,与短路逻辑运算符相比,非短路逻辑运算符的实际用途是什么?换句话说,总是通过使用非短路逻辑运算符来评估双方的用法是什么?&&||
T.J*_*der 28
更新的答案:
道歉,我错过了这个词"逻辑"在你的问题,即使它是在那里.(我冒昧地用编辑来强调它.)
考虑您希望始终发生任何副作用的情况,无论左手表达式是否评估true或false.对比:
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)
让我们假设两者foo并bar有我们的影响要拥有无论发生foo退货true或false.在上面的第一个,我知道这bar将永远被调用,并有其效果.当然,后者bar可能会或可能不会被召唤.如果我们没有非短路版本,我们必须使用临时变量:
boolean fooResult, barResult;
fooResult = foo();
barResult = bar();
if (fooResult && barResult) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
你也许会说(我可能会),你应该这样做无论如何,因为它太容易误读if (foo() & bar()),但我们去,对于具有非短路版本务实的原因.
原始答案:
您如何建议&(或|)成为短路运营商?使用&&和||,它是有道理的,因为你正在处理布尔条件:它们可以是真或假,没有灰色阴影.但是&和|处理比特,而不是布尔值.结果是一个数字.我的意思是,&如果左侧是左侧,我想无法评估右侧,如果左侧是全部位,无论类型是什么0,同样|无法评估它,但我不是看到很多点使每个运算符的一个边缘情况显着(与254个或更多其他情况相比).
pai*_*lee 13
在某些情况下,布尔表达式的组件涉及您希望在所有情况下执行的操作.请考虑以下检查密码有效性的示例:
while ( !password.isValid() & (attempts++ < MAX_ATTEMPTS) ) {
// re-prompt
}
Run Code Online (Sandbox Code Playgroud)
如果由于短路而没有评估第二个条件,则attempts永远不会增加.因此,启用了更高的程序员灵活性.