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


167

我一直认为&&Java 中的运算符用于验证其两个布尔操作数是否均为true,并且该&运算符用于对两种整数类型进行按位运算。

最近,我知道&运算符也可以用于验证其两个布尔操作数是否都是true,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。

&Java中的运算符是否在内部重载?还是这背后还有其他概念?



Double可能会执行快捷方式。
尼古拉斯·汉密尔顿

Answers:


278

&<-验证两个操作数
&& <-停止评估第一个操作数是否为false,因为结果为false

(x != 0) & (1/x > 1)<-这意味着先评估(x != 0)再评估(1/x > 1)&。问题是对于x = 0,这将引发异常。

(x != 0) && (1/x > 1)<-这意味着求值,(x != 0)并且只有当它为true时才求值,(1/x > 1)所以如果x = 0,则这是绝对安全的,并且如果(x!= 0)求值为false,则整个对象都将直接求为false没有评估(1/x > 1)

编辑:

exprA | exprB< -这意味着评估exprA再评估exprB,然后做|

exprA || exprB<-这意味着进行评估,exprA并且只有这样才能false进行评估exprB并执行||


7
写一个&或|的原因是什么?在if语句中?它永远不会比&&和||更快。如果我们已经可以回答,为什么还要检查第二个条件?请提供一个现实的例子吗?
Michu93年

14
@ Michu93:一个例子是,如果第二个条件是一个函数调用,它具有您始终需要的副作用。由于通常应避免产生副作用,因此只有极少数情况下需要这样做,而我现在还无法想到一个实际的例子。
Heinzi

54

除了通过对两个操作数求值都不是一个懒惰的求值者,我认为按位运算符的主要特征像下面的示例一样比较每个操作数字节:

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

2
问题是关于逻辑布尔运算,而不是按位运算。
罗恩侯爵,

21
@EJP它可以帮助仍然像我一样只阅读标题的Google员工。
Ad Infinitum

29
boolean a, b;

Operation     Meaning                       Note
---------     -------                       ----
   a && b     logical AND                    short-circuiting
   a || b     logical OR                     short-circuiting
   a &  b     boolean logical AND            not short-circuiting
   a |  b     boolean logical OR             not short-circuiting
   a ^  b     boolean logical exclusive OR
  !a          logical NOT

short-circuiting        (x != 0) && (1/x > 1)   SAFE
not short-circuiting    (x != 0) &  (1/x > 1)   NOT SAFE

谢谢安德烈亚斯(Andreas)的编辑,也许其他问题也对您有帮助:stackoverflow.com/questions/4014535/vs-and-vs
Torres

11

这取决于参数的类型...

对于整数参数,单“&”号是“按位与”运算符。除了两个布尔参数外,没有为任何其他对象定义双“&”号。

对于布尔参数,单“&”号构成(无条件)“逻辑AND”运算符,而双“&”号(“ &&”)则为“条件逻辑AND”运算符。也就是说,单“&”号始终会评估两个自变量,而双“&”号只会在第一个自变量为true时才评估第二个自变量。

对于所有其他参数类型和组合,应发生编译时错误。


9

&&是短路运算符,而&是AND运算符。

试试这个。

    String s = null;
    boolean b = false & s.isEmpty(); // NullPointerException
    boolean sb = false && s.isEmpty(); // sb is false

7

JLS(15.22.2)中所指定:

当&,^或|的两个操作数时 运算符的类型为布尔值或布尔值,则按位运算符表达式的类型为布尔值。在所有情况下,操作数都根据需要进行拆箱转换(第5.1.8节)。

对于&,如果两个操作数值都为true,则结果值为true;否则,结果为true。否则,结果为假。

对于^,如果操作数值不同,则结果值为true;否则,结果为true。否则,结果为假。

对于|,如果两个操作数值均为false,则结果值为false;否则,结果为false。否则,结果为true。

“技巧”是&一个整数按位运算符以及一个布尔逻辑运算符。因此,为什么不这样做,将其作为运算符重载的示例是合理的。


7

我认为我的答案可以更容易理解:

&和之间有两个区别 &&

如果它们用作逻辑AND

&并且&&可以是逻辑的AND,当&或时&&左右表达式结果全部为true时,整个运算结果可以为true。

什么时候&&&逻辑上AND存在区别:

&&用作逻辑AND,如果左边的表达式结果为false,则右边的表达式将不会执行。

举个例子:

String str = null;

if(str!=null && !str.equals("")){  // the right expression will not execute

}

如果使用&

String str = null;

if(str!=null & !str.equals("")){  // the right expression will execute, and throw the NullPointerException 

}

其他示例:

int x = 0;
int y = 2;
if(x==0 & ++y>2){
    System.out.print(“y=”+y);  // print is: y=3
}

int x = 0;
int y = 2;
if(x==0 && ++y>2){
    System.out.print(“y=”+y);  // print is: y=2
}

&可用作位运算符

&可以用作按位AND运算符, &&不能。

当且仅当其操作数中的两个位都为1时,按位与“&”运算符才产生1。但是,如果两个位均为0或两个位均不同,则此运算符将产生0。 AND如果两个位中的任何一位为1,则“&”运算符将返回1;如果两个位中的任何一位为0,则它​​将返回0。 

在Wiki页面上:

http://www.roseindia.net/java/master-java/java-bitwise-and.shtml


4

'&&':-是逻辑AND运算符,根据其自变量的逻辑关系产生布尔值true或false。

例如:-Condition1 && Condition2

如果Condition1为false,则(Condition1 && Condition2)始终为false,这就是为什么此逻辑运算符也称为短路运算符的原因,因为它不评估其他条件。如果Condition1为false,则无需评估Condtiton2。

如果Condition1为true,则评估Condition2,如果为true,则总体结果为true,否则为false。

'&':-是按位与运算符。如果两个输入位均为一,则在输出中产生一(1)。否则,它会产生零(0)。

例如:-

int a = 12; // 12的二进制表示形式是1100

int b = 6; // 6的二进制表示形式是0110

int c =(a&b); //(12&6)的二进制表示形式是0100

c的值为4。

供参考,请参阅此http://techno-terminal.blogspot.in/2015/11/difference-between-operator-and-operator.html


3

&&||被称为短路运算符。使用它们时,对于||-如果第一个操作数的值为true,则不计算其余操作数。对于&&-如果第一个操作数的计算结果为false,则其他所有都不会得到评估。

因此,if (a || (++x > 0))在此示例中,如果a为,则变量x不会递增true


3

使用布尔值时,两者之间没有输出差异。您可以交换&&和&或|| 和 并且永远不会改变您的表情结果。

区别在于正在处理信息的场景。当您为a = 0且b = 1的表达式“(a!= 0)&(b!= 0)”正确时,将发生以下情况:

left side: a != 0 --> false
right side: b 1= 0 --> true
left side and right side are both true? --> false
expression returns false

当您(a != 0) && ( b != 0)在a = 0和b = 1时编写表达式时,将发生以下情况:

a != 0 -->false
expression returns false

更少的步骤,更少的处理,更好的编码,尤其是在执行许多布尔表达式或复杂参数时。


2
如果操作数具有副作用,它将更改表达式的整体结果。
罗恩侯爵,

3

除了&&和|| 如果是短路,则在混合两种形式时也要考虑操作员的优先权。我认为,result1和result2包含不同的值对每个人来说都不是立即显而易见的。

boolean a = true;
boolean b = false;
boolean c = false;

boolean result1 = a || b && c; //is true;  evaluated as a || (b && c)
boolean result2 = a  | b && c; //is false; evaluated as (a | b) && c

0

&是按位运算符加,用于检查两个条件,因为有时我们需要评估两个条件。但是当第一个条件为真时,&&逻辑运算符会转到第二个条件。


0

所有答案都是great,而且似乎还有no更多答案,is needed 但我只是想指出一些有关&&运算符的内容dependent condition

在使用运算符&&的表达式中,一个条件(我们称其为“条件”)dependent condition可能要求另一个条件为真,以使从属条件的评估有意义。

在这种情况下,应将依赖条件放在&&运算符之后,以防止发生错误。

考虑一下表达式(i != 0) && (10 / i == 2)。从属条件(10 / i == 2)必须appear after使&&操作员防止被零除的可能性。

另一个例子 (myObject != null) && (myObject.getValue() == somevaluse)

和另一件事:&&||被称为短路评价因为第二个参数被执行或评估only iffirst参数确实not sufficedetermine所述valueexpression

参考:Java™如何编程(早期对象),第十版

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.