【问题标题】:Difference between & and && in Java? [duplicate]Java中&和&&的区别? [复制]
【发布时间】: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;的区别与|||的区别一样。)
  • 所以,我想新的问题是:我怎么知道是选择 & 还是选择 &&?我理解 && 当且仅当第一个条件为真时才检查第二个条件(与 & 自动检查两者),但是选择一个而不是另一个有什么好处?
  • @Mike Gates 这是一个方便的例子 if(x!=null && x.length>0)... 如果我们在这里使用 & 而不是 && 那么如果 x 是null 我们会得到一个 NullPointerException,使用 && 可以防止这种情况发生,因为如果 x 为 null 则永远不会调用 x.length。
  • && 短路了。

标签: java operators


【解决方案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】:

&& == 逻辑与

& = 按位与

【讨论】:

猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
相关资源
最近更新 更多