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

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

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

那么使用或使用有什么区别?|||

注意:我研究了这个问题,并找到了自己的答案,我将其包含在下面。请随时纠正我或给出自己的观点。肯定有改进的余地!


答案 1

两者有不同的用途。尽管在许多情况下(在处理布尔值时),它们似乎具有相同的效果,但重要的是要注意逻辑 OR 是短路的,这意味着如果它的第一个参数计算为 true,则第二个参数未被计算。无论如何,按位运算符都会计算其两个参数。

类似地,逻辑 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,因此计算停止。第二个 print 语句错误,因为它不是短路,并且遇到除以零的情况。


答案 2

逻辑运算符处理布尔值,按位运算符处理位。在这种情况下,效果将是相同的,但有两个区别:

  1. 按位运算符不是为此而设的,这使得阅读变得更加困难,但最重要的是
  2. 逻辑 OR 运算符将计算第一个条件。如果为真,则下一个条件的结果无关紧要,结果将为真,因此不执行第二个子句

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

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