按位运算符和单个&符号

14 java bit-manipulation operators

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

我可以使用单个&符号&而不是按位运算符&&吗?可能会出现什么样的差异,是否有一个明确说明这个问题的具体例子?

Log*_*gan 40

单身&将始终检查两个条件.&&如果第一个条件的计算结果为false,则double 将在第一个条件后停止.如果你真的只需要1个2的条件为真或假,则使用2是一种"短路"条件检查的方法.

一个例子可能是:

if (myString != null && myString.equals("testing"))
Run Code Online (Sandbox Code Playgroud)

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

  • with &¦两个操作数总是被评估
  • with &&¦¦第二个操作数仅在必要时进行评估

这是一个页面的链接,其中有很好的解释如何使用这些.

关于运算符的Java快速参考

  • 完全正确.使用"&","|" 和朋友,如果你想扭曲比特(例如对于位图标志).使用"&&"或"||" 如果你想评估"如果这个,那么"条件.使用后者的一个重要考虑因素是"短路评估",这意味着评估将在遇到明确的"真实"或"错误"时停止. (2认同)

Hot*_*cks 17

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

首先,doubled运算符&&||函数类似于嵌套if语句:

if (expression_a && expression_b) {
    do_something;
}
Run Code Online (Sandbox Code Playgroud)

相当于

if (expression_a) {
    if (expression_b) {
        do_something;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,如果expression_a评估到false那时expression_b将不会被评估 - 称为"短路"的特征.(||情况类似,但头发更复杂.)

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

单个运营商,&并且|,在另一方面,是相对"纯"的操作符(可交换和可结合相对于本身),以无双运营商的"短路"的.另外,它们可以对任何整数类型进行操作 - 布尔值,char,byte,short,int,long.它们执行逐位操作 - 左操作数的N位与右操作数的N位进行AND运算或OR运算,以产生与两个操作数具有相同位宽的结果值中的第N位(在它们之后)适用于二元运算符的加宽).在这方面,他们的操作boolean只是堕落的情况(尽管有些特殊情况).

通常,只使用doubled运算符在if语句中组合布尔表达式.如果所涉及的布尔表达式是"安全的"(例如,不能导致空指针异常),则使用单个运算符没有太大的危害,但是双倍运算符往往效率稍高,并且通常需要短路(因为if (a != null && a.b == 5),例如),所以培养使用双重形式的习惯通常是明智的.唯一需要注意的是,如果你想要评估第二个表达式(对于它的副作用),doubled运算符将不保证会发生这种情况.