Java中&和&&的区别? [复制]
Posted
技术标签:
【中文标题】Java中&和&&的区别? [复制]【英文标题】:Difference between & and && in Java? [duplicate] 【发布时间】:2011-11-04 04:58:24 【问题描述】:可能的重复:What's the difference between | and || in Java?Difference in & and &&
我只是想知道 & 和 && 之间的区别是什么?
几天前,我为if
语句写了一个条件,看起来像:
if(x < 50 && x > 0)
但是,我将 && 更改为 & 并没有显示任何错误。有什么区别?
示例:我编译了这个简单的程序:
package anddifferences;
public class Main
public static void main(String[] args)
int x = 25;
if(x < 50 && x > 0)
System.out.println("OK");
if(x < 50 & x > 0)
System.out.println("Yup");
它打印出“OK”和“Yup”。如果它们都有效,那么我使用哪一个有关系吗?
【问题讨论】:
(不是完全同一个问题,但&
和&&
的区别与|
和||
的区别一样。)
这是一个较旧的:P ***.com/questions/4014535/vs-and-vs
所以,我想新的问题是:我怎么知道是选择 & 还是选择 &&?我理解 && 当且仅当第一个条件为真时才检查第二个条件(与 & 自动检查两者),但是选择一个而不是另一个有什么好处?
@Mike Gates 这是一个方便的例子 if(x!=null && x.length>0)... 如果我们在这里使用 & 而不是 && 那么如果 x 是null 我们会得到一个 NullPointerException,使用 && 可以防止这种情况发生,因为如果 x 为 null 则永远不会调用 x.length。
&& 短路了。
【参考方案1】:
'&' 执行两个测试,而 '&&' 仅在第一个测试也为真时执行第二个测试。这被称为短路并且可以被认为是一种优化。这在防止空值(NullPointerException)方面特别有用。
if( x != null && x.equals("*BINGO*")
then do something with x...
【讨论】:
嗯....什么?你是什么意思&执行这两个测试?这是一个按位与运算 第一个条件不应该是x != null
吗?当 x
为 null
时,该示例仍会引发 NPE。顺便说一句,一般的开发人员通常会反过来检查:if ("*BINGO*".equals(x))
。
@Jesus Ramos:两个测试都意味着&
检查x != null
(我假设mP 意味着!=)和x.equals("*BINGO*")
。使用 &&,如果 x != null
返回 false,则整个语句将无法评估为 true,因此不会检查第二个条件,从而确保在尝试评估第二个条件时不会出现异常(即也称为短路,如前所述)
@KM:是的,感谢您注意到 != 错字。
@BC 我不得不想一些简单的人为例子,就这么简单。【参考方案2】:
&
是按位的。
&&
是合乎逻辑的。
&
计算操作的两侧。&&
计算操作的左侧,如果是 true
,则继续计算右侧。
【讨论】:
很好的答案。比“逻辑和按位”更完整,这对于回答这个问题的人来说并没有太多意义。 & 如果操作数是布尔值,则不是按位的。仅当它们是不可分割的。 @EJP 实际上,&
是 对于boolean
操作数的按位。双方的操作仍将被评估。
Jeffrey,“按位”并不意味着“计算两个操作数”。这意味着“分别对每个位进行操作”。
@JohnP 这并没有改变将&
或|
与boolean
一起使用被视为按位运算的事实。 boolean
是一位,它的实现可能占用 4 或 8 个字节的内存这一事实有些随意。【参考方案3】:
& 是按位与运算符比较每个操作数的位。 例如,
int a = 4;
int b = 7;
System.out.println(a & b); // prints 4
//meaning in an 32 bit system
// 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000111
// ===================================
// 00000000 00000000 00000000 00000100
&& 是逻辑 AND 运算符,仅比较操作数的布尔值。它需要两个表示布尔值的操作数并对它们进行惰性求值。
【讨论】:
& 如果操作数是布尔值,则不是按位的。仅当它们是不可分割的。【参考方案4】:&& == 逻辑与
& = 按位与
【讨论】:
按位阅读更多信息@en.wikipedia.org/wiki/Bitwise_operation & 如果操作数是布尔值,则不是按位的。仅当它们是不可分割的。以上是关于Java中&和&&的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章