Answers:
&<-验证两个操作数
&& <-停止评估第一个操作数是否为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
并执行||
。
除了通过对两个操作数求值都不是一个懒惰的求值者,我认为按位运算符的主要特征像下面的示例一样比较每个操作数字节:
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
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
如JLS(15.22.2)中所指定:
当&,^或|的两个操作数时 运算符的类型为布尔值或布尔值,则按位运算符表达式的类型为布尔值。在所有情况下,操作数都根据需要进行拆箱转换(第5.1.8节)。
对于&,如果两个操作数值都为true,则结果值为true;否则,结果为true。否则,结果为假。
对于^,如果操作数值不同,则结果值为true;否则,结果为true。否则,结果为假。
对于|,如果两个操作数值均为false,则结果值为false;否则,结果为false。否则,结果为true。
“技巧”是&
一个整数按位运算符以及一个布尔逻辑运算符。因此,为什么不这样做,将其作为运算符重载的示例是合理的。
我认为我的答案可以更容易理解:
&
和之间有两个区别 &&
。
如果它们用作逻辑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
'&&':-是逻辑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
使用布尔值时,两者之间没有输出差异。您可以交换&&和&或|| 和 并且永远不会改变您的表情结果。
区别在于正在处理信息的场景。当您为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
更少的步骤,更少的处理,更好的编码,尤其是在执行许多布尔表达式或复杂参数时。
&是按位运算符加,用于检查两个条件,因为有时我们需要评估两个条件。但是当第一个条件为真时,&&逻辑运算符会转到第二个条件。
所有答案都是great
,而且似乎还有no
更多答案,is needed
但我只是想指出一些有关&&
运算符的内容dependent condition
在使用运算符&&的表达式中,一个条件(我们称其为“条件”)dependent condition
可能要求另一个条件为真,以使从属条件的评估有意义。
在这种情况下,应将依赖条件放在&&运算符之后,以防止发生错误。
考虑一下表达式(i != 0) && (10 / i == 2)
。从属条件(10 / i == 2)
必须appear after
使&&
操作员防止被零除的可能性。
另一个例子 (myObject != null) && (myObject.getValue() == somevaluse)
和另一件事:&&
和||
被称为短路评价因为第二个参数被执行或评估only if
的first
参数确实not suffice
到determine
所述value
的expression