按位运算符和单个&符号
可能重复:
为什么我们通常使用||
不是|
, 有什么不同?
我可以使用单个&符号而不是像&&
那样的按位运算符吗? 可能会出现什么样的差异,是否有一个明确说明这个问题的具体例子?
单一&
将始终检查两个条件。 如果计算结果为false,则双&&
将在第一个条件后停止。 如果你真的只需要1的2个条件为真或假,则使用2是一种“短路”条件检查的方法。
一个例子可能是:
if (myString != null && myString.equals("testing"))
如果myString
为null
,则第一个条件将失败,并且不会检查它的值。 这是一种可以避免空指针的方法。
- 使用
&
和¦
两个操作数总是被评估 - 使用
&&
和¦¦
第二个操作数仅在必要时进行评估
这是一个页面的链接,其中有很好的解释如何使用这些。
关于运算符的Java快速参考
其他答案在某种程度上是正确的,但不解释整个事情。
首先,加倍运算符, &&
和||
,函数类似于嵌套的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
的操作只是简并的情况(尽管有些特殊情况)。
通常,只使用doubled运算符在if
语句中组合布尔表达式。 如果涉及的布尔表达式是“安全的”(例如,不能导致空指针exception),则使用单个运算符没有太大的危害,但是加倍的运算符往往效率稍高,并且通常需要短路(如同if (a != null && ab == 5)
,例如),所以培养使用双重forms的习惯通常是明智的。 唯一要注意的是,如果你想要评估第二个表达式(对于它的副作用),doubled运算符将不保证会发生这种情况。