按位运算符和单与号 [重复]
Posted
技术标签:
【中文标题】按位运算符和单与号 [重复]【英文标题】:Bitwise operator and single ampersand [duplicate] 【发布时间】:2012-01-31 06:40:42 【问题描述】:可能重复:Why do we usually use
||
not|
, what is the difference?
我可以使用像&
这样的单& 号而不是像&&
这样的按位运算符吗?可能会出现什么样的差异,有没有具体的例子可以清楚地说明这个问题?
【问题讨论】:
这听起来有点像吹毛求疵,但另一个问题是询问a/a/主导编码变体的原因,而这个问题有点“宽泛”;如果将 Hot Licks 的答案(第二个)作为“为什么我们通常使用 || 而不是 |,有什么区别?”这个问题的答案,将(更多)不合适。虽然它在这里提供了(在我看来)有价值的额外见解 【参考方案1】:单个&
将始终检查这两个条件。如果计算结果为 false,则双 &&
将在第一个条件之后停止。使用两个是一种“短路”条件检查的方法,如果您真的只需要 2 的 1 个条件为真或假。
一个例子可以是:
if (myString != null && myString.equals("testing"))
如果myString
是null
,第一个条件将失败,它不会费心检查它的值。这是避免空指针的一种方法。
&
和 ¦
始终计算两个操作数
&&
和 ¦¦
仅在必要时才计算第二个操作数
这是一个页面链接,其中很好地解释了如何使用这些。
Java Quick Reference on Operators
【讨论】:
绝对正确。使用“&”、“|”和朋友,如果你想旋转位(例如位图标志)。使用“&&”或“||”如果你想评估“如果这个,那么那个”的条件。使用后者的一个重要考虑因素是“短路评估”,这意味着评估将在遇到明确的“真”或“假”时停止。 链接现在指向垃圾邮件 我现在更新了链接以使用另一个站点。感谢您指出这一点。【参考方案2】:其他答案在一定程度上是正确的,但不要解释整个事情。
首先,双重运算符&&
和||
,函数有点像嵌套的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
,例如。
另一方面,单运算符&
和|
是相对“纯”的运算符(相对于它们自身可交换和关联),没有双运算符的“短路”。此外,它们可以对任何整数类型进行操作——boolean、char、byte、short、int、long。它们执行逐位运算——左操作数的位 N 与右操作数的位 N 进行 AND 或 OR 运算,以产生与两个操作数的位宽相同的结果值中的第 N 位(在它们之后为二元运算符适当加宽)。在这方面,他们对boolean
的操作只是退化的情况(尽管有点特殊)。
通常,在if
语句中组合布尔表达式时,只会使用加倍运算符。如果所涉及的布尔表达式是“安全的”(例如,不会导致空指针异常),则使用单个运算符并没有太大的危害,但是双运算符往往效率更高,并且通常需要短路(就像在if (a != null && a.b == 5)
中一样,例如),所以培养使用双重形式的习惯通常是明智的。唯一需要注意的是,如果您想要对第二个表达式进行求值(因为它的副作用),doubled 运算符不能保证会发生这种情况。
【讨论】:
很好地解释了为什么单运算符形式适用于布尔表达式,帮助我理解。以上是关于按位运算符和单与号 [重复]的主要内容,如果未能解决你的问题,请参考以下文章