我知道 &&
和 ||
的规则,但是 &
和 |
是什么意思?请用示例解释一下。
我知道 &&
和 ||
的规则,但是 &
和 |
是什么意思?请用示例解释一下。
这些是位与和位或运算符。
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.1, 15.22.2) 中关于操作符基于其输入的不同行为的适当部分。
实际上,当两个输入都是布尔值时,这些操作符被认为是布尔逻辑操作符,并且与条件与 (&&
) 和条件或 (||
) 操作符类似,除了它们不会短路,所以以下代码是安全的:
if((a != null) && (a.something == 3)){
}
这不是:
if((a != null) & (a.something == 3)){
}
"短路"指运算符不一定检查所有条件。在上面的例子中,当a不为null时(否则整个语句将返回false,无论如何都不会检查后续条件),&&
仅检查第二个条件,因此a.something
语句不会引发异常,或被认为是“安全”的。而&
运算符总是检查子句中的每个条件,因此在上述示例中,如果a实际上是null值,则可能会评估a.something
并引发异常。我想你在谈论这两个运算符的逻辑含义,这里是一个表格概述:
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 时,整个表达式必须为 false;当 OR 函数的第一个参数为 true 时,整个表达式必须为 true。
非安全操作 意味着操作符总是检查子句中的每个条件,因此在上述示例中,如果 x 实际上为 0 值,则会评估 1/x 并引发异常。
我知道这里有很多答案,但它们似乎有点令人困惑。因此,在Java Oracle学习指南中进行了一些研究后,我总结出了使用&&或&的三种不同情况。 这三种情况是逻辑AND、位AND和布尔AND。
逻辑AND:
逻辑AND(又称条件AND)使用&&运算符。它是短路的,意思是:如果左操作数为false,则不会评估右操作数。
例子:
int x = 0;
if (false && (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); // "0"
在上面的示例中,打印到控制台的x的值将为0,因为if语句中的第一个操作数为false,因此java没有必要计算(1 == ++x),因此x不会被计算。int a = 5; // 5 in binary is 0101
int b = 12; // 12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4
如您所见,在这个例子中,当数字5和12的二进制表示对齐时,执行按位与操作只会产生一个二进制数字,其中两个数字中相同的位都是1。因此,0101& 1100 == 0100。这在十进制下等于5& 12 == 4。
布尔 AND: 现在,布尔 AND 运算符的行为类似而不同于按位 AND 和逻辑 AND。我喜欢将其视为在两个布尔值(或比特)之间执行按位 AND,因此它使用&运算符。布尔值也可以是逻辑表达式的结果。
它返回 true 或者 false 值,就像逻辑 AND 一样,但与逻辑 AND 不同,它没有短路保护。原因是,为了执行按位 AND,它必须知道左右操作数的值。以下是一个例子:
int x = 0;
if (false & (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); //"1"
现在当运行那个if语句时,即使左操作数为false,表达式(1 == ++x)也将被执行。因此打印出的x值将为1,因为它已经被递增。
这也适用于逻辑或(||),按位或(|)和布尔或(|)。希望这能消除一些困惑。
& 和 | 与 && 和 || 运算符提供相同的结果。不同之处在于,它们总是评估表达式的两侧,而 && 和 || 在确定结果时如果第一个条件足以,则停止评估。
&&
运算符,会同时计算两个条件,而 ||
只有在第一个条件为真时才返回结果。 - Buhake Sindi(2&4)
的结果为false
,而(2 && 4)
的结果为true
。这两个结果如何完全相同? - Piskvor left the building2&4
的结果是一个整数,而不是布尔值(在这种情况下为零)。 2 && 4
将无法编译,&& 只接受布尔值。 Java 不允许混合布尔值和整数:零不是 false
,false
不是零... - user85421&&
,只有在第一个操作数为 true
时才会评估第二个操作数。 - user207421&&和||是逻辑运算符.... 短路
&和|是布尔逻辑运算符.... 非短路
移动到表达式执行的差异。位运算符不考虑左侧结果而评估双侧。但在使用逻辑运算符评估表达式的情况下,右侧表达式的评估取决于左侧条件。
例如:
int i = 25;
int j = 25;
if(i++ < 0 && j++ > 0)
System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);
int i = 25;
int j = 25;
if(i++ < 0 & j++ > 0)
System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);
&
和 |
是整数类型(例如int
)的位运算符:http://download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
&&
和 ||
仅对布尔值进行操作(并且像其他答案已经说过的那样,会短路)。
&
和|
也是布尔类型的布尔运算符。 - user207421if ( (1>2) && (2>1) | true) // false!
如果计算一个包含布尔&运算符的表达式,则会计算两个操作数。然后将&运算符应用于操作数。
当计算涉及&&运算符的表达式时,首先计算第一个操作数。如果第一个操作数计算结果为false,则跳过第二个操作数的计算。
如果第一个操作数返回true值,则计算第二个操作数。如果第二个操作数返回true值,则将&&运算符应用于第一个和第二个操作数。
|和||同理。