Java 位运算符和单与
可能重复:Java 位运算符和单与,java,operators,bit-manipulation,Java,Operators,Bit Manipulation,可能重复: 我是否可以使用像&这样的单符号和,而不是像&这样的位运算符?可能会出现什么样的差异?有没有具体的例子来清楚地说明这个问题 单个和将始终检查这两种情况。如果计算结果为false,则双&&将在第一个条件后停止。如果您确实只需要1个条件2为真或假,则使用2是“短路”条件检查的一种方式 例如: if (myString != null && myString.equals("testing")) 如果myString为null,则第一个条件将失败,并且不必检查它的值。这是
我是否可以使用像
&
这样的单符号和,而不是像&
这样的位运算符?可能会出现什么样的差异?有没有具体的例子来清楚地说明这个问题 单个和将始终检查这两种情况。如果计算结果为false,则双&&
将在第一个条件后停止。如果您确实只需要1个条件2为真或假,则使用2是“短路”条件检查的一种方式
例如:
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
上使用&&
或|
,例如
另一方面,单运算符,&
和|
是相对“纯”的运算符(相对于自身可交换和关联),没有双运算符的“短路”。此外,它们可以对任何整数类型进行操作——布尔型、字符型、字节型、短型、整型、长型。它们执行逐位运算——左操作数的N位与右操作数的N位进行AND或or运算,以生成结果值中的第N位,该结果值的位宽与两个操作数的位宽相同(根据二进制运算符的需要加宽后)。在这方面,它们对布尔值的操作只是退化情况(尽管是有点特殊的情况)
通常,在if
语句中,只使用加倍运算符组合布尔表达式。如果所涉及的布尔表达式是“安全的”(不会导致空指针异常,例如),则使用单运算符不会有很大的危害,但双运算符往往效率稍高,并且通常需要短路(如在中,如果(a!=null&&a.b==5)
,例如),因此,培养使用双重形式的习惯通常是明智的。唯一需要注意的是,如果要计算第二个表达式(因为它的副作用),则double运算符不能保证会发生这种情况。绝对正确。如果您想旋转位(例如,用于位图标志),请使用“&”、“|”和“朋友”。如果要计算“if this,then that”条件,请使用“&&”或“| |”。使用后者的一个重要考虑因素是“短路评估”,这意味着评估将在遇到确定的“真”或“假”时停止。现在链接指向SpamI更新链接以使用另一个站点。感谢您指出这一点。关于为什么单运算符形式适用于布尔表达式的很好的解释帮助我理解。这听起来可能有点像吹毛求疵,但另一个问题问a/占主导地位的编码变体的原因,而这个问题有点“宽泛”;Hot Clicks的答案(第二个)如果作为“为什么我们通常使用| |而不是|,有什么区别?”这个问题的答案(在我看来)将(更)不合适,同时它提供了(在我看来)有价值的额外见解