Java中&和&&的区别?

Mxy*_*xyk 150 java operators

可能重复:
|之间的区别是什么 和|| 在Java?
&和&&的区别

我只是想知道&&&之间的区别是什么?
几天我写了一个if声明的条件看起来像:

if(x < 50 && x > 0)
Run Code Online (Sandbox Code Playgroud)

但是,我改变了&&只是&并没有表现出错误.有什么不同?


示例:我编译了这个简单的程序:

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它印有"OK"和"Yup".如果它们都起作用,那么我使用哪一个呢?

Jef*_*rey 371

&是有点的. &&合乎逻辑.

&评估操作的两个方面.
&&评估操作的左侧,如果是true,则继续并评估右侧.

  • 很好的答案.比"逻辑和按位"更完整,这对回答这个问题的人来说并不多. (19认同)
  • 如果操作数是布尔值,则不是按位.只有它们是不可分割的. (11认同)
  • 杰弗里,"按位"并不意味着"评估两个操作数".这意味着"分别对每个位进行操作". (8认同)
  • @JohnP这并没有改变使用`&`或`|`和`boolean`被认为是按位运算的事实.`boolean`*是*一位,它的实现可能占用4或8字节的内存这一事实有点武断. (4认同)
  • 您在这里与 [JLS](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22) 争论。&amp; 是按位运算符或逻辑运算符,具体取决于其操作数。您的语言表明按位意味着两个操作数都被评估。事实并非如此。 (2认同)

sua*_*uat 72

&是按位AND运算符,比较每个操作数的位.
例如,

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
Run Code Online (Sandbox Code Playgroud)


&&是逻辑AND运算符,仅比较操作数的布尔值.它需要两个操作数来指示一个布尔值并对它们进行惰性求值.

  • 如果操作数是布尔值,则不是按位.只有它们是不可分割的. (15认同)

Boo*_*eus 43

&& ==逻辑AND

&=按位AND

  • 在bitwise @ http://en.wikipedia.org/wiki/Bitwise_operation上阅读更多内容 (10认同)
  • 如果操作数是布尔值,则不是按位.只有它们是不可分割的. (3认同)

mP.*_*mP. 33

'&'执行两个测试,而'&&'仅执行第二个测试,如果第一个测试也是如此.这被称为短路,可以视为优化.这在防止nullness(NullPointerException)时特别有用.

if( x != null && x.equals("*BINGO*") {
  then do something with x...
}
Run Code Online (Sandbox Code Playgroud)

  • 第一个条件不应该是`x!= null`吗?当`x`为'null`时,该示例仍然会抛出NPE.顺便说一句,普通开发人员通常会反过来检查它:`if("*BINGO*".equals(x)){}`. (3认同)
  • @Jesus Ramos:这两个测试意味着 `&amp;` 检查 `x != null` (我假设 mP 意味着 !=)和 `x.equals("*BINGO*")`。使用 &amp;&amp; 时,如果 `x != null` 返回 false,则整个语句不可能计算为 true,因此不会检查第二个条件,从而确保在尝试计算第二个条件时不会出现异常(如上所述,这也称为短路) (2认同)