按位运算符和单个 & 符号

2022-09-02 14:23:11

可能的重复:
为什么我们通常使用||而不是|,有什么区别?

我可以使用单个 & 符号(如 )而不是按位运算符(如 ?可能会产生什么样的差异,是否有具体的例子来清楚地说明这个问题?&&&


答案 1

单身人士将始终检查这两个条件。如果双精度值的计算结果为 false,它将在第一个条件之后停止。使用2是一种“短路”条件检查,如果你真的只需要1个条件2是真还是假。&&&

例如:

if (myString != null && myString.equals("testing"))

如果是,第一个条件将失败,并且不会费心检查它的值。这是避免空指针的一种方法。myStringnull

  • with 和两个操作数始终被计算&¦
  • with 和第二个操作数仅在必要时才计算&&¦¦

这是一个页面的链接,该页面很好地解释了如何使用这些内容。

有关运算符的 Java 快速参考


答案 2

其他答案在某种程度上是正确的,但不能解释整个事情。

首先,双精度运算符和 , 的功能有点像嵌套语句:&&||if

if (expression_a && expression_b) {
    do_something;
}

等效于

if (expression_a) {
    if (expression_b) {
        do_something;
    }
}

在这两种情况下,如果评估到那么将不会被评估 - 一种称为“短路”的特征。(情况类似,但头发更复杂。expression_afalseexpression_b||

此外,在 Java 中(但不在 C/C++ 中),和 运算符仅适用于布尔值 - 您不能在 , 例如上使用 或 。&&||&&||int

另一方面,单运算符和是相对“纯”运算符(相对于自身的交换和关联),没有双运算符的“短路”。此外,它们可以对任何整数类型进行操作 - 布尔值,字符,字节,短整型,整数型,长整型。它们执行逐位运算 -- 左操作数的位 N 与右操作数的位 N 一起被 ANDed 或 ORed,以产生与两个操作数的位宽度相同的结果值中的第 N 位(在它们根据二进制运算符的需要加宽之后)。在这方面,它们的操作只是退化的情况(尽管有些特殊情况)。&|boolean

通常,人们只使用双精度运算符来组合语句中的布尔表达式。如果所涉及的布尔表达式是“安全的”(不能导致空指针异常,例如),则使用单个运算符不会有很大的危害,但是双精度运算符往往效率略高,并且通常需要短路(例如),因此通常明智的做法是培养使用双精度形式的习惯。唯一需要注意的是,如果您希望计算第二个表达式(因为它的副作用),则双精度运算符将不能保证发生这种情况。ifif (a != null && a.b == 5)