【问题标题】:Difference between OR operator || and | in Java? [duplicate]OR 运算符 || 之间的区别和 |在 Java 中? [复制]
【发布时间】:2012-04-10 07:08:17
【问题描述】:

可能重复:
Why do we usually use || not |, what is the difference?

谁能解释一下java中OR运算符(|||)的区别和用法。谢谢

例如:

if(a || b) {
// Do something.
}

if(a | b) {
// Do something.
}

【问题讨论】:

  • 前者为逻辑或运算符,后者为位或运算符。或多或少的主要区别在于逻辑计算结果为布尔值,按位计算取决于被 ORed 的类型。您还有其他一些不同之处。
  • 类似问题已经回答stackoverflow.com/questions/7101992/…

标签: java


【解决方案1】:

这很简单。 http://www.roseindia.net/help/java/o/java-operator.shtml 说:

OR 运算符是一种条件运算符,表示为 通过 |象征。它根据状态返回真值或假值 变量,即使用条件运算符的操作是 在两个布尔表达式之间执行。

OR 运算符 (|) 类似于 Conditional-OR 运算符 (||) 和 如果一个或另一个操作数为真,则返回真。

注意:在|| 运算符中如果有多个条件并且如果第一个条件return true 则忽略其他条件,但在| 运算符中所有条件检查。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html有更多信息

【讨论】:

    【解决方案2】:

    第一个是逻辑或。运算符的两边都作为boolean 值处理,结果为boolean。如果有问题的变量本身不是boolean,如果它们是0null,它们就会变为假。

    第二个是按位或运算符。这个通常只适用于整数。我逐位比较这两个值并给出结果数字。例如:

    5   | 6   = 7    (decimal)
    101 | 110 = 111  (binary)
    

    更多详情请查看Wikipedia: Logical disjunction

    【讨论】:

    • 我完全同意 Nitram 的帖子。不得不提的是,即使开发人员使用带布尔值的按位运算符,Java 编译器也会计算 true | false
    【解决方案3】:

    如果使用运算符 || JVM 不会单独计算右手操作数。

    【讨论】:

      【解决方案4】:

      || operator 是一个布尔运算符

      可以用简单的英文解释为...

      if ( a is true or b is true)
      {
       //do soemthing
      }
      

      该 |运算符是逻辑运算符

      它仅适用于整数类型,如 int、char 等...

      是两个操作数的按位或运算

      示例:

      bool a = true;
      bool b = false;
      
      bool c = a | b;
      
      //c will  be true
      
      
      if(a | b )
      {
      
      
      }
      
      is same as
      
      c = a | b;
      
      if ( c == true)
      {
        do something;
      }
      

      【讨论】:

        【解决方案5】:

        第一个是逻辑或,后者是位或。但是,如果两个运算符(在您的示例中为 a 和 b)是布尔值,则按位或被视为逻辑或没有短路。这有时会很方便。

        例如,考虑:

        boolean getTrue() {
            System.out.println("getTrue() called");
            return true;
        }
        
        public static void main(String[] args) {
            boolean a = getTrue() || getTrue();
            System.out.println("Result: " + a);
        }
        

        上面将只打印一次“getTrue() called”,因为逻辑或 (||) 可以立即确定表达式的结果,而无需第二次调用 getTrue()。更改为按位或(即 boolean a = getTrue() | getTrue();)将导致对 getTrue() 的两次调用。

        使用按位 & 操作和 getFalse() 方法会产生类似的结果。

        另一个需要考虑的方面是位运算符优先于逻辑运算符。因此,不建议按位混合它们,否则将在逻辑与之前执行,这可能会导致不良行为。可以使用方括号()来修复,但我认为应该避免这种情况。

        作为旁注,我不同意你的问题的否决票,这是一个有效的好问题! (给它+1)

        【讨论】:

          猜你喜欢
          • 2015-12-09
          • 2010-10-16
          • 2010-12-30
          • 2012-09-09
          • 2021-12-23
          • 2022-01-19
          • 1970-01-01
          • 1970-01-01
          • 2013-05-16
          相关资源
          最近更新 更多