布尔运算符的差异:& vs && 和 |与||

我知道 和 的规则,但什么是 和 ?请用一个例子向我解释这些。&&||&|


答案 1

这些是按位 AND 和按位 OR 运算符。

int a = 6; // 110
int b = 4; // 100

// Bitwise AND    

int c = a & b;
//   110
// & 100
// -----
//   100

// Bitwise OR

int d = a | b;
//   110
// | 100
// -----
//   110

System.out.println(c); // 4
System.out.println(d); // 6

感谢 Carlos 指出 Java 语言规范(15.22.115.22.2)中关于运算符基于其输入的不同行为的适当部分。

实际上,当两个输入都是布尔值时,运算符被视为布尔逻辑运算符,其行为类似于条件和 () 和条件或 () 运算符,除了它们不会短路,因此以下内容是安全的:&&||

if((a != null) && (a.something == 3)){
}

这不是:

if((a != null) & (a.something == 3)){
}

“短路”意味着操作员不一定检查所有条件。在上面的例子中,只有当不是时才会检查第二个条件(否则整个语句将返回false,并且无论如何都检查以下条件是没有意义的),因此语句不会引发异常,或者被认为是“安全的”。&&anulla.something

运算符始终检查子句中的每个条件,因此在上面的示例中,当实际上是一个值时,可能会进行计算,从而引发异常。&a.somethinganull


答案 2

我想你说的是两个运算符的逻辑含义,这里有一个表简历:

boolean a, b;

Operation     Meaning                       Note
---------     -------                       ----
   a && b     logical AND                    short-circuiting
   a || b     logical OR                     short-circuiting
   a &  b     boolean logical AND            not short-circuiting
   a |  b     boolean logical OR             not short-circuiting
   a ^  b     boolean logical exclusive OR
  !a          logical NOT

short-circuiting        (x != 0) && (1/x > 1)   SAFE
not short-circuiting    (x != 0) &  (1/x > 1)   NOT SAFE

短路求值、最小求值或麦卡锡求值(在 John McCarthy 之后)是某些编程语言中某些布尔运算符的语义,其中第二个参数仅在第一个参数不足以确定表达式的值时才执行或计算:当 AND 函数的第一个参数计算结果为 false 时, 总体值必须为假;当 OR 函数的第一个参数计算结果为 true 时,总体值必须为 true。

Not Safe 意味着运算符始终检查子句中的每个条件,因此在上面的示例中,当 x 实际上是 0 值时,可能会计算 1/x,从而引发异常。


推荐