&和&&的区别
我总是认为Java中的&&
运算符用于validation它的布尔操作数是否为true
,并且使用&
运算符对两个整数types进行按位运算。
最近我知道&
运算符也可以用来validation它的布尔操作数是否为true
,唯一的区别就是它检查RHS操作数,即使LHS操作数是假的。
Java中的&
运算符是否内部重载? 还是有其他一些背后的概念?
&< – validation两个操作数
&& < – 停止评估第一个操作数是否为false,因为结果为false
(x != 0) & (1/x > 1)
< – 这意味着评估(x != 0)
然后评估(1/x > 1)
然后执行&。 问题是,对于x = 0,这将引发exception。
(x != 0) && (1/x > 1)
< – 这意味着评估(x != 0)
,只有当这是真的,然后评估(1/x > 1)
所以如果你有x = 0那么这是完全安全的,如果(x!= 0)的计算结果为false,则不会抛出任何exception,直接计算结果为false而不计算(1/x > 1)
。
编辑:
exprA | exprB
exprA | exprB
< – 这意味着评估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
这取决于参数的types…
对于整数参数,单和号(“&”)是“按位与”运算符。 双和号(“&&”)没有为两个布尔参数定义。
对于布尔参数,单个&符号构成(无条件的)“逻辑AND”运算符,而双和号(“&&”)是“条件逻辑AND”运算符。 也就是说,单个&符号总是对两个参数进行求值,而如果第一个参数为真,双和号将只计算第二个参数。
对于所有其他参数types和组合,应该发生编译时错误。
&&是一个短路操作符,而&是一个AND操作符。
尝试这个。
String s = null; boolean b = false & s.isEmpty(); // NullPointerException boolean sb = false && s.isEmpty(); // sb is false
这正如JLS(15.22.2)中的规定 :
当&,^或|两个操作数 运算符的types是布尔型或布尔型,那么按位运算符expression式的types是布尔型的。 在任何情况下,操作数都必须根据需要进行拆箱转换(§5.1.8)。
对于&,如果两个操作数值都为真,则结果值为真; 否则,结果是错误的。
对于^,如果操作数值不同,结果值为真; 否则,结果是错误的。
对于|,如果两个操作数的值均为false,则结果值为false; 否则,结果是真的。
“技巧”是&
是一个整数位运算符以及一个布尔逻辑运算符 。 那么为什么不把这看作是运营商超载的一个例子是合理的。
&&
和||
被称为短路操作员。 当它们被使用时,用于||
– 如果第一个操作数的计算结果为true
,则不计算其余的操作数。 对于&&
– 如果第一个操作数的计算结果为false
,则其余部分根本不会被计算。
所以if (a || (++x > 0))
在这个例子中variablesx不会增加,如果一个是true
。
'&&': – 是一个逻辑AND运算符根据其参数的逻辑关系产生布尔值true或false。
例如: – Condition1 && Condition2
如果条件1为假,则(条件1 &&条件2)将始终为假,这就是为什么该逻辑运算符也被称为短路运算符的原因,因为它不评估其他条件。 如果Condition1是错误的,那么就不需要评估Condtiton2。
如果Condition1为true,则评估Condition2,如果为true,则总体结果为true,否则为false。
'&': – 是一个按位与运算符。 如果两个input位都是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
对于布尔值来说,两者之间没有输出差异。 您可以交换&&和&或|| 和| 它永远不会改变你的expression的结果。
信息正在处理的场景背后有所不同。 当你对a = 0和b = 1expression式“(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时,当你写一个expression式(a != 0) && ( b != 0)
时,会发生以下情况:
a != 0 -->false expression returns false
更less的步骤,更less的处理,更好的编码,尤其是在执行许多布尔expression式或复杂的参数时。
我想我的答案可以更容易理解:
&
和&&
有两个区别。
如果他们使用逻辑与
&
和&&
可以是逻辑AND
,当&
或&&
左右expression式结果全部为真时,整个运算结果可以为真。
当&
和&&
逻辑AND
,有一个区别:
当使用&&
作为逻辑AND
,如果左expression式结果为false,则右expression式将不会执行。
举个例子:
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
运算符, &&
不能。
按位AND“&”运算符当且仅当其操作数中的两个位均为1时才产生1.但是,如果两个位均为0或两个位都不相同,则此运算符产生0.为了更精确地按位如果两个位中的任何一个为1,则“&”运算符返回1,如果任何位为0,则返回0。
从维基页面:
http://www.roseindia.net/java/master-java/java-bitwise-and.shtml
&是一个按位运算符,用于检查两个条件,因为有时我们需要评估两个条件。 但是逻辑运算符在第一个条件为真时转到第二个条件。
所有的答案都great
,似乎no
更多的答案is needed
但我只是想指出一些关于&&
操作符称为dependent condition
在使用operator &&的expression式中,一个条件(我们称之为dependent condition
可能需要另一个条件才能评估相关条件为真。
在这种情况下,依赖条件应放在&&操作符之后以防止错误。
考虑expression式(i != 0) && (10 / i == 2)
。 依赖条件(10 / i == 2)
必须appear after
&&
操作符appear after
,以防止被零除的可能性。
另一个例子(myObject != null) && (myObject.getValue() == somevaluse)
另一件事: &&
和||
被称为短路评估,因为第二个参数only if
在first
参数not suffice
determine
expression
的value
only if
被执行或计算
参考文献: Java™如何编程(早期对象),第十版
除了&&和|| 短时间切换,混合两种forms时也要考虑到运营商的优先级。 我认为每个人都不会立即明白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