位运算符和单个&符号

19

这可能听起来有点吹毛求疵,但另一个问题询问了主流编码变体的一个原因,而这个问题则略微“宽泛”一些;Hot Licks的回答(第二个)如果作为“为什么我们通常使用||而不是|,有什么区别?”这个问题的答案,则会(更)不合适,尽管在这里它提供了(我认为)有价值的额外见解。 - user2039709
2个回答

48

单个的&符号总是会检查两个条件。双重的&&如果第一个条件为false,就会停止继续检查后面的条件。使用两个符号可以“短路”条件检查,当你只需要其中1个条件满足或不满足时。

例如:

if (myString != null && myString.equals("testing"))
如果myStringnull,第一个条件将失败,并且不会检查其值。这是一种避免空指针的方法之一。
  • 使用&¦时,两个操作数都会被评估
  • 使用&&¦¦时,只有在必要时才会评估第二个操作数

这里有一个链接,其中有一个相当好的解释如何使用它们。

Java运算符快速参考


2
完全正确。如果你想要操作位(例如用于位图标志),请使用"&"、"|"及类似的运算符。如果您想要评估“如果这样,那么”的条件语句,请使用"&&"或"||"。使用后者时需要注意一个重要问题是“短路求值”,这意味着在遇到确定的“真”或“假”时,计算将立即停止。 - paulsm4
链接现在指向垃圾邮件。 - Basic
我现在更新了链接,使用另一个网站。感谢您指出这一点。 - Logan

22

其他答案在某种程度上是正确的,但并没有完全解释清楚。

首先,双重运算符 &&|| 的功能有点像嵌套的 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)中),因此一般最好养成使用双重形式的习惯。唯一要注意的是,如果你希望第二个表达式被评估(由于其副作用),双重运算符将不能保证发生这种情况。


很好的解释为什么单个运算符形式适用于布尔表达式,帮助我理解了。 - Roman

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