以下两个if块的内容应该执行:
if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}
那么使用|
或使用||
注意:我调查了这个并找到了我自己的答案,我在下面提到了答案。请随时纠正我或给自己的看法。肯定还有改进的余地!
答案 0 :(得分:37)
两者有不同的用途。虽然在许多情况下(处理布尔值时)看起来它们可能具有相同的效果,但重要的是要注意逻辑OR是短路的,这意味着如果它的第一个参数的计算结果为真,那么第二个参数就会离开未评估。按位运算符无论如何都会计算它的两个参数。
类似地,逻辑AND是短路的,这意味着如果它的第一个参数的计算结果为false,那么第二个参数将被取消评估。再次,按位AND不是。
你可以在这里看到这个:
int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 | y/x == 1);
第一个print语句工作正常并返回true,因为第一个参数的计算结果为true,因此评估停止。第二个打印语句错误,因为它不是短路,并且遇到除零。
答案 1 :(得分:14)
逻辑运算符用于布尔值,而按位运算符用于位。在这种情况下,效果将是相同的,但有两个不同之处:
这里有一些方便的代码来证明这一点:
public class OperatorTest {
public static void main(String[] args){
System.out.println("Logical Operator:");
if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){
//doNothing
}
System.out.println("Bitwise Operator:");
if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){
//doNothing
}
}
public static boolean sayAndReturn(boolean ret, String msg){
System.out.println(msg);
return ret;
}
}
答案 2 :(得分:6)
对于程序员来说,只有一个区别。
booleanFunction()||如果其中任何一个为true,则otherBooleanFunction()将为true。同样, booleanFunction()&&如果其中一个为false,则otherBooleanFunction()将为false。那么,为什么要测试另一个呢。这就是逻辑运算符的作用。
但是按位检查两者。这个概念的经常应用如下。
if(someObject != null && someObject.somemethod())
因此,在这种情况下,如果您将&&
替换为&
,那么请等待灾难。你很快就会得到令人讨厌的NullPointerException ......
答案 3 :(得分:4)
if( booleanFunction() || otherBooleanFunction() ) {...}
如果booleanFunction()
返回true
,则在此情况下,otherBooleanFunction()
将无法执行。
if( booleanFunction() | otherBooleanFunction() ) {...}
但是在按位运算符中,无论booleanFunction()
返回otherBooleanFunction()
还是booleanFunction()
true
和false
两个函数
答案 4 :(得分:0)
按位和逻辑运算符之间的区别 - 1.按位运算符用于位,而逻辑运算符用于语句。 2.按位并由&表示。而逻辑和由&&表示。 3.按位或由|表示而逻辑或由||。
表示