可能是重复问题:
为什么我们通常使用 ||
而不是 |
,它们有什么区别?
我可以像使用位运算符 &&
一样使用单个和号 &
吗?这可能会引起什么差异,是否有明确的示例来阐明这个问题?
可能是重复问题:
为什么我们通常使用 ||
而不是 |
,它们有什么区别?
我可以像使用位运算符 &&
一样使用单个和号 &
吗?这可能会引起什么差异,是否有明确的示例来阐明这个问题?
单个的&
符号总是会检查两个条件。双重的&&
如果第一个条件为false,就会停止继续检查后面的条件。使用两个符号可以“短路”条件检查,当你只需要其中1个条件满足或不满足时。
例如:
if (myString != null && myString.equals("testing"))
如果myString
是null
,第一个条件将失败,并且不会检查其值。这是一种避免空指针的方法之一。
&
和¦
时,两个操作数都会被评估&&
和¦¦
时,只有在必要时才会评估第二个操作数这里有一个链接,其中有一个相当好的解释如何使用它们。
其他答案在某种程度上是正确的,但并没有完全解释清楚。
首先,双重运算符 &&
和 ||
的功能有点像嵌套的 if
语句:
if (expression_a && expression_b) {
do_something;
}
等同于
if (expression_a) {
if (expression_b) {
do_something;
}
}
对于两种情况,如果expression_a
的值为false
,则 expression_b
将不会被计算 -- 这是一种被称为“短路”的特性。(||
的情况类似,但稍微复杂一些。)
此外,在Java中(但不适用于C / C ++),&&
和||
运算符仅适用于布尔值 -- 不能在整数上使用&&
或||
,例如int
。
另一方面,单个运算符&
和|
相对较“纯”(对它们自身而言是可交换和可结合的),没有双运算符的“短路”功能。此外,它们可以对任何整数类型进行操作 -- 布尔值、char、byte、short、int、long。它们执行按位操作 -- 左操作数的第N位与右操作数的第N位进行AND或OR运算,以产生结果值的第N位,该结果值与两个操作数的位宽大小相同(根据二进制运算符适当地扩展操作数)。在这方面,它们与boolean
一起操作只是退化情况(虽然这是一个有些特殊情况的例子)。
通常,在if
语句中组合布尔表达式时,只使用双重运算符。如果涉及的布尔表达式是“安全”的(例如不能导致空指针异常),则使用单个运算符并没有太大危害,但双重运算符往往略微更有效,并且经常需要短路操作(例如在if (a!= null && a.b == 5)
中),因此一般最好养成使用双重形式的习惯。唯一要注意的是,如果你希望第二个表达式被评估(由于其副作用),双重运算符将不能保证发生这种情况。