我只是想知道为什么我们通常在两个布尔值之间使用逻辑OR ||,而不是按位或|,尽管它们都工作得很好。
我的意思是,看看下面这些:
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
我们可以用|代替||吗?&和&&也是一样。
当我遇到这个问题时,我创建了测试代码来了解这个问题。
public class HelloWorld{
public static boolean bool(){
System.out.println("Bool");
return true;
}
public static void main(String []args){
boolean a = true;
boolean b = false;
if(a||bool())
{
System.out.println("If condition executed");
}
else{
System.out.println("Else condition executed");
}
}
}
在这种情况下,我们只改变if条件的左边值加上a或b。
||场景,当左侧为true时[if(a||bool())]
输出"If条件已执行"
||场景,当左边为false [if(b||bool())]
输出-
Bool
If condition executed
||结论当使用||时,右侧只检查左侧为假。
|场景,当左侧为true时[if(a|bool())]
输出-
Bool
If condition executed
|场景,当左侧为false [if(b|bool())]
输出-
Bool
If condition executed
|结论使用|时,请同时检查左右两侧。
如果使用||和&&形式,而不是这些操作符的|和&形式,Java将不会费心单独计算右操作数。
这是一个你是否想要缩短评估的问题——大多数时候你想这样做。
说明短路的好处的一个好方法是考虑下面的例子。
Boolean b = true;
if(b || foo.timeConsumingCall())
{
//we entered without calling timeConsumingCall()
}
正如Jeremy和Peter提到的,短路的另一个好处是空引用检查:
if(string != null && string.isEmpty())
{
//we check for string being null before calling isEmpty()
}
更多信息
1).(expression1 | expression2), |运算符将计算expression2,而不管expression1的结果是真还是假。
例子:
class Or
{
public static void main(String[] args)
{
boolean b=true;
if (b | test());
}
static boolean test()
{
System.out.println("No short circuit!");
return false;
}
}
2).(expression1 || expression2),如果expression1为真,||操作符将不计算expression2。
例子:
class Or
{
public static void main(String[] args)
{
boolean b=true;
if (b || test())
{
System.out.println("short circuit!");
}
}
static boolean test()
{
System.out.println("No short circuit!");
return false;
}
}