我只是想知道为什么我们通常在两个布尔值之间使用逻辑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

我们可以用|代替||吗?&和&&也是一样。


当前回答

通常在有前加和后加运算符时使用。请看下面的代码:

package ocjpPractice;
/**
 * @author tithik
 *
 */
public class Ex1 {

    public static void main(String[] args) {
    int i=10;
    int j=9;
    int x=10;
    int y=9;
    if(i==10 | ++i>j){
        System.out.println("it will print in first if");  
        System.out.println("i is: "+i);
    }

    if(x==10 ||++x>y){
        System.out.println("it will print in second if");   
        System.out.println("x is: "+x);
    }
    }
}

输出:

它将首先打印 I是:11 它将以秒if打印 X = 10

两个if块相同,但结果不同。 当存在|时,两个条件都将被计算。但如果它是||,它将不会评估第二个条件,因为第一个条件已经为真。

其他回答

操作符||和&&被称为条件操作符,而|和&被称为位操作符。它们有不同的用途。

条件操作符仅适用于在左侧和右侧都静态求值为布尔值的表达式。

位操作符适用于任何数字操作数。

如果希望执行逻辑比较,则应该使用条件操作符,因为您将向代码添加某种类型安全。

通常在有前加和后加运算符时使用。请看下面的代码:

package ocjpPractice;
/**
 * @author tithik
 *
 */
public class Ex1 {

    public static void main(String[] args) {
    int i=10;
    int j=9;
    int x=10;
    int y=9;
    if(i==10 | ++i>j){
        System.out.println("it will print in first if");  
        System.out.println("i is: "+i);
    }

    if(x==10 ||++x>y){
        System.out.println("it will print in second if");   
        System.out.println("x is: "+x);
    }
    }
}

输出:

它将首先打印 I是:11 它将以秒if打印 X = 10

两个if块相同,但结果不同。 当存在|时,两个条件都将被计算。但如果它是||,它将不会评估第二个条件,因为第一个条件已经为真。

因此,在其他答案的基础上,举个例子,短路在以下防御性检查中至关重要:

if (foo == null || foo.isClosed()) {
    return;
}

if (bar != null && bar.isBlue()) {
    foo.doSomething();
}

使用|和&可能导致在这里抛出NullPointerException。

附注:Java有|=,但没有||=

必须使用||的一个例子是,当第一个表达式是测试第二个表达式是否会爆炸时。例:在以下情况下使用单个|可能导致NPE。

public static boolean isNotSet(String text) {
   return text == null || text.length() == 0;
}

||通过OR'ing两个值返回布尔值(这就是为什么它被称为逻辑或)

IE:

if (A || B) 

如果A或B中有一个为真则返回真,如果它们都为假则返回假。

|是一个对两个值执行位操作的运算符。为了更好地理解位操作,你可以阅读这里:

http://en.wikipedia.org/wiki/Bitwise_operation