&和&&的区别

我总是认为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 iffirst参数not suffice determine expressionvalue 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