为什么我们通常使用 || 而不是 |?它们有什么区别?

240

我很好奇为什么我们通常在两个布尔值之间使用逻辑或||而不是位或|,尽管它们都能正常工作。

我的意思是,看看下面这个例子:

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

我们可以使用|代替||吗?同样的,&&&也一样。


18
大多数人忘记了 | 除了作为位运算符外,还可用作非短路布尔运算符。 - John Meagher
67
它们并不相同。请查看有关它们的教程,特别是有关短路求值与急切求值的部分。||&&是短路求值,而|&则是急切求值。 - Hovercraft Full Of Eels
4
纯好奇,你真的有使用非短路版本的情况吗?我几乎总是看到 &&||,但从未见过 &|。如果你要做一些依赖副作用的事情,我不明白为什么会使用类似 (a & b | c) 这样的表达式,因为很容易想到“我可以通过使用短路版本来优化这个表达式”。 - Mike Bailey
1
这是位运算布尔值与“逻辑”(即与数学“逻辑”有关)之间的区别。逻辑运算符“短路”的事实有些偶然,但非常重要。 - Hot Licks
2
当然,它们具有不同的优先级。 - Hot Licks
显示剩余2条评论
28个回答

0
通常我在使用前增量和后增量运算符时会这样做。请看下面的代码:
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 中打印
i 的值是:11

如果 x 是 10,它将会在第二个 if 中打印
x 的值是:10

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


1
我觉得这很令人困惑。 - NimChimpsky

0

有很多使用情况建议您选择使用||而不是|。一些使用情况必须使用|运算符来检查所有条件。

例如,如果您想要检查表单验证并且想要向用户显示所有无效字段的错误文本而不仅仅是第一个无效字段。

||运算符将会是,

   if(checkIfEmpty(nameField) || checkIfEmpty(phoneField) || checkIfEmpty(emailField)) {
      // invalid form with one or more empty fields
   }

   private boolean checkIfEmpty(Widget field) {
      if(field.isEmpty()) {
        field.setErrorMessage("Should not be empty!");
        return true;
      }
      return false;
   }

因此,如果用户提交了所有空字段的表单,则仅显示nameField和错误消息。但是,如果您将其更改为以下内容:

   if(checkIfEmpty(nameField) | checkIfEmpty(phoneField) | checkIfEmpty(emailField)) {
      // invalid form with one or more empty fields
   }

它将显示每个字段的适当错误消息,而不考虑true条件。


0

| 表示按位或,|| 表示逻辑或


2
缺少 | 也是一种非短路布尔运算符。 - John Meagher

0

仔细阅读这个主题后,我仍然不确定在Java模式实践中使用|作为逻辑运算符是否符合规范。

最近,我修改了一个拉取请求中的代码,以解决一个评论问题。

if(function1() | function2()){
  ...
}

必须更改为

boolean isChanged = function1();
isChanged |= function2();
if (isChanged){
  ...
}

实际接受的版本是什么?

Java文档没有提到|作为逻辑非短路或运算符。

不是想要投票,而是想找出标准! 两个代码版本都编译并按预期工作。


这不是关于代码是否具有按位或运算符(|)或逻辑或运算符(||)。然而,如果您看到Dair对这个问题的回答,那么很明显逻辑或仅在必要时检查右侧,而按位或每次都会检查两侧。 - Varun Jain

-1

|| 是逻辑或,而 | 是按位或。


-1

-1

1
缺少 | 也是一种非短路布尔运算符。 - John Meagher

-2

| 是一种位运算符。|| 是一种逻辑运算符。

一个会取两个位并进行或运算。

一个将确定真相(这个或那个)。如果这个是真的或那个是真的,那么答案就是真的。

哦,人们回答这些问题得好快啊。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接