Java中&和&&的区别是什么?

166

可能存在重复问题:
Java中 | 和 || 的区别是什么?
& 和 && 的区别是什么?

我想知道&&&之间的区别。 几天前我写了一个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"。如果它们都能起作用,那么使用哪一个有关系吗?


4
“&”和“&&”的区别与“|”和“||”的区别类似,不完全相同。 - Stephen C
这是一个比较老的帖子 :P https://dev59.com/22865IYBdhLWcg3wCqHI - Paul Bellora
2
所以,我猜新的问题是:我怎么知道是该选择&还是&&?我明白&&只有在第一个条件为真的情况下才会检查第二个条件(而&则会自动检查两个条件),但是选择其中一个的优势是什么呢? - Mxyk
3
@Mike Gates 这是一个方便的例子,如果我们在这里使用&而不是&&,那么如果x为null,我们将会得到一个NullPointerException。使用&&可以避免这种情况发生,因为如果x为null,则永远不会调用x.length。 - default_avatar
&& 是短路运算符。 - huuthang
4个回答

416

& 表示位运算。&& 表示逻辑运算。

& 会对运算符两边的值都进行运算。
&& 会先运算左边的值,如果它是 true,才会继续运算右边的值。


28
好的回答。比“逻辑和位运算”更完整,这对回答此问题的人来说没有多大帮助。 - notbad.jpeg
13
如果操作数是布尔类型,& 运算符不是按位运算符,只有当操作数是整型时才是按位运算符。请注意,不要改变原意,使内容更易懂,但不要添加解释。 - user207421
10
Jeffrey,“位运算”并不意味着“评估两个操作数”。它意味着“分别对每个位进行操作”。 - user207421
2
你在这里与JLS争论。&是一个按位或逻辑运算符,取决于其操作数。你的语言表明按位运算符意味着两个操作数都被评估。但实际上并不是这样。 - user207421
4
@JohnP 这并不改变使用 &| 与一个 boolean 被认为是按位操作的事实。一个 boolean 就是 一位,它的实现可能占用4或8字节的内存是有些任意的。 - Jeffrey
显示剩余9条评论

79

& 是按位与运算符,用于比较每个操作数的位。
例如,

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


&& 是逻辑与运算符,仅比较操作数的布尔值。它需要两个表示布尔值的操作数,并对它们进行延迟求值。


17
如果操作数是布尔值,& 运算符就不是按位运算符,只有当操作数是整数时才是按位运算符。请注意,不要改变原意。 - user207421

42

&& == 逻辑与

& = 按位与


11
请访问以下链接阅读有关位运算的更多信息:http://en.wikipedia.org/wiki/Bitwise_operation。 - Book Of Zeus
4
如果操作数是布尔值,那么&不是按位运算符,只有操作数是整数时才是。 - user207421

41

'&'执行两个测试,而'&&'仅在第一个测试为真时才执行第二个测试。这被称为短路评估,并且可以被视为一种优化。这在防止空指针异常(NullPointerException)方面特别有用。

if( x != null && x.equals("*BINGO*") {
  then do something with x...
}

1
嗯...什么?你是说&执行了两个测试吗?这是一个按位与操作。 - Jesus Ramos
3
第一个条件不应该是x != null吗?如果xnull,那个例子依然会抛出NPE异常。顺便说一下,大多数开发者通常会使用另一种方式进行检查:if ("*BINGO*".equals(x)) {} - BalusC
2
@Jesus Ramos: 两个测试都是意味着 & 检查 x != null(我假设mP的意思是!=) 和 x.equals("*BINGO*"). 如果使用 &&,如果x != null返回 false,整个语句不可能为 true,所以第二个条件将不会被检查,从而确保在尝试评估第二个条件时不会出现异常 (这也称为短路,如上所述)。 - K Mehta
@KM:是的,感谢您注意到了“!=”打错的问题。 - mP.
@BC 我不得不想出一个简单的人为例子,这大概是最简单的了。 - mP.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接