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”。如果它们都有效,那么我使用哪一个有关系吗?

【问题讨论】:

(不是完全同一个问题,但&amp;&amp;&amp;的区别与|||的区别一样。) 这是一个较旧的: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吗?当 xnull 时,该示例仍会引发 NPE。顺便说一句,一般的开发人员通常会反过来检查:if ("*BINGO*".equals(x)) @Jesus Ramos:两个测试都意味着&amp; 检查x != null(我假设mP 意味着!=)和x.equals("*BINGO*")。使用 &&,如果 x != null 返回 false,则整个语句将无法评估为 true,因此不会检查第二个条件,从而确保在尝试评估第二个条件时不会出现异常(即也称为短路,如前所述) @KM:是的,感谢您注意到 != 错字。 @BC 我不得不想一些简单的人为例子,就这么简单。【参考方案2】:

&amp; 是按位的。 &amp;&amp; 是合乎逻辑的。

&amp; 计算操作的两侧。&amp;&amp; 计算操作的左侧,如果是 true,则继续计算右侧。

【讨论】:

很好的答案。比“逻辑和按位”更完整,这对于回答这个问题的人来说并没有太多意义。 & 如果操作数是布尔值,则不是按位的。仅当它们是不可分割的。 @EJP 实际上,&amp; 对于boolean 操作数的按位。双方的操作仍将被评估。 Jeffrey,“按位”并不意味着“计算两个操作数”。这意味着“分别对每个位进行操作”。 @JohnP 这并没有改变将&amp;|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中&和&&的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java中&和&&的区别

Java中&和&&的区别

Java中,&&与&,||与|的区别

Java中&&和&的区别

Java中&&和&的区别

Java中,&&与&,||与|的区别