我一直认为Java中的&&
运算符用于验证它的布尔操作数是否都是true
,而&
运算符用于对两个整数类型进行逐位运算。
最近我开始知道&
运算符也可用于验证它的布尔操作数是否都是true
,唯一的区别是它检查RHS操作数,即使LHS操作数为假。
Java内部的&
运算符是否在内部重载?或者这背后有其他一些概念吗?
&< - 验证两个操作数 && < - 停止评估第一个操作数是否计算为false,因为结果将为false
(x != 0) & (1/x > 1)
(x != 0)
然后评估(1/x > 1)
然后做&。问题是,对于x = 0,这将引发异常。
(x != 0) && (1/x > 1)
(x != 0)
并且只有当这是真的然后评估(1/x > 1)
所以如果你有x = 0那么这是非常安全的并且如果(x!= 0)评估为false则不会抛出任何异常,整个事物直接评估为假而不评估(1/x > 1)
。
编辑:
exprA | exprB
exprA
然后评估exprB
然后做|
。
exprA || exprB
exprA
,只有这是false
然后评估exprB
并做||
。
对于布尔值,两者之间没有输出差异。你可以交换&&和&或||和|它永远不会改变你的表达结果。
区别在于处理信息的场景。当你为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 = 1时编写表达式(a != 0) && ( b != 0)
时,会发生以下情况:
a != 0 -->false
expression returns false
更少的步骤,更少的处理,更好的编码,尤其是在做许多布尔表达式或复杂的参数时。
除了&&和||在短路时,在混合两种形式时也要考虑运算符优先级。我认为对于每个人来说,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
&是一个按位运算符加上用于检查两个条件,因为有时我们需要评估这两个条件。但是&&逻辑运算符在第一个条件给出时转到第二个条件。
所有的答案都是great
,似乎no
更多回答is needed
但我只是想指出一些关于&&
运算符叫做dependent condition
在使用运算符&&的表达式中,一个条件 - 我们称之为dependent condition
-可能需要另一个条件才能使依赖条件的评估有意义。
在这种情况下,依赖条件应放在&&运算符之后以防止错误。
考虑表达式(i != 0) && (10 / i == 2)
。依赖条件(10 / i == 2)
必须appear after
&&
运算符,以防止被零除的可能性。
另一个例子(myObject != null) && (myObject.getValue() == somevaluse)
另一件事:&&
和||
被称为short-circuit evaluation,因为第二个参数被执行或评估only if
first
论证做not suffice
到determine
value
的expression
除了通过评估两个操作数不是一个惰性求值器,我认为按位运算符的主要特征比较操作数的每个字节,如下例所示:
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
这取决于参数的类型......
对于整数参数,单个&符号(“&”)是“按位AND”运算符。除了两个布尔参数之外,没有为任何东西定义双符号(“&&”)。
对于布尔参数,单个&符号构成(无条件)“逻辑AND”运算符,而双&符号(“&&”)构成“条件逻辑AND”运算符。也就是说单个&符号总是计算两个参数,而双&符号仅在第一个参数为真时才计算第二个参数。
对于所有其他参数类型和组合,应发生编译时错误。
&&是短路运算符,而&是AND运算符。
试试这个。
String s = null;
boolean b = false & s.isEmpty(); // NullPointerException
boolean sb = false && s.isEmpty(); // sb is false
我想我的答案可以更容易理解:
&
和&&
有两个不同之处。
如果他们使用逻辑AND
&
和&&
可以是逻辑AND
,当&
或&&
左右表达结果都是真的时,整个操作结果可以是真的。
当&
和&&
作为逻辑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
}
&可以用作位运算符
&
可以用作Bitwise AND
运算符,&&
不能。
当且仅当其操作数中的两个位都是1时,按位AND“&”运算符产生1。但是,如果两个位都为0或两个位都不同,则此运算符产生0.更精确地按位如果两个位中的任何一个为1,则“&”运算符返回1,如果任何位为0,则返回0。
来自维基页面:
http://www.roseindia.net/java/master-java/java-bitwise-and.shtml
它是在JLS (15.22.2)中指定的:
当两个操作数都是&,^或|时operator的类型为boolean或Boolean,则按位运算符表达式的类型为boolean。在所有情况下,操作数都根据需要进行拆箱转换(第5.1.8节)。
对于&,如果两个操作数值都为真,则结果值为true;否则,结果是错误的。
对于^,如果操作数值不同,则结果值为true;否则,结果是错误的。
对于|,如果两个操作数值都为false,则结果值为false;否则,结果是真的。
“技巧”是&
是整数位运算符以及布尔逻辑运算符。那么为什么不这样,将此视为运算符重载的一个例子是合理的。
'&&': - 是一个逻辑AND运算符,根据其参数的逻辑关系产生一个布尔值true或false。
例如: - Condition1 && Condition2
如果Condition1为假,则(Condition1 && Condition2)将始终为false,这就是为什么此逻辑运算符也称为短路运算符的原因,因为它不评估另一个条件。如果Condition1为false,则无需评估Condtiton2。
如果Condition1为true,则计算Condition2,如果为true,则整体结果为true,否则为false。
'&': - 是一个按位AND运算符。如果输入位都是1,则在输出中产生一(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
&&
和||
被称为短路运营商。当它们被使用时,对于||
- 如果第一个操作数计算为true
,则不评估其余的操作数。对于&&
- 如果第一个操作数评估为false
,则其余部分根本不进行评估。
所以if (a || (++x > 0))
在这个例子中,如果a是true
,变量x将不会增加。