在Java中的if块中使用逻辑运算符或按位运算符之间有区别吗?

应执行以下两个if块的内容:

if( booleanFunction() || otherBooleanFunction() ) {...} if( booleanFunction() | otherBooleanFunction() ) {...} 

那么使用|之间的区别是什么 或使用||

注意:我调查了这个并找到了我自己的答案,我在下面提到了答案。 请随时纠正我或给自己的看法。 肯定还有改进的余地!

这两者有不同的用途。 虽然在许多情况下(处理布尔值时)可能看起来它们具有相同的效果,但重要的是要注意逻辑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. 按位运算符不适用于此,这使得它更难以阅读,但最重要的是
  2. 逻辑OR运算符将评估第一个条件。 如果是真的,那么下一个条件导致什么并不重要,结果将是真的,所以第二个子句不会被执行

这里有一些方便的代码来certificate这一点:

 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; } } 

对于程序员来说,只有一个区别。

  1. 你的逻辑运算符是逻辑运算符,即它们只测试一个条件并根据它得到结果。

booleanFunction()|| 如果其中任何一个为true,则otherBooleanFunction()将为true。 同样,如果其中一个为false,则booleanFunction()&& otherBooleanFunction()将为false。 那么,为什么要测试另一个呢。 那是逻辑运算符的作用。

但是按位检查两者。 该概念的频繁应用如下。

 if(someObject != null && someObject.somemethod()) 

因此,在这种情况下,如果您将&&替换为&然后等待灾难。 你很快就会得到令人讨厌的NullPointerException ……

 if( booleanFunction() || otherBooleanFunction() ) {...} 

在这种情况下,如果booleanFunction()返回true则不会执行otherBooleanFunction()

 if( booleanFunction() | otherBooleanFunction() ) {...} 

但是在按位运算符中,无论booleanFunction()返回true还是false都会执行booleanFunction()otherBooleanFunction()函数。

按位逻辑运算符-1之间的差异。位运算符用于位,而逻辑运算符用于语句。 2.按位并用&表示逻辑,用&&表示。 3.按位或由|表示 而逻辑或由||表示。