我一直认为Java中的&&操作符用于验证其布尔操作数是否为真,并且&操作符用于对两个整数类型进行逐位操作。

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

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)求值为假,整个事情直接求值为假,而不求(1/x > 1)。

编辑:

exprA | exprB <——这意味着评估exprA然后评估exprB,然后执行|。

exprA || exprB <——这意味着评估exprA,只有当这是假的,然后评估exprB,并执行||。

其他回答

&&和||称为短路算子。当使用它们时,对于|| -如果第一个操作数求值为true,则其余操作数不求值。对于&& -,如果第一个操作数求值为false,其余的操作数根本不被求值。

所以if (a || (++x > 0))在这个例子中,如果a为真,变量x不会增加。

& <——验证两个操作数 && <——如果第一个操作数求值为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)求值为假,整个事情直接求值为假,而不求(1/x > 1)。

编辑:

exprA | exprB <——这意味着评估exprA然后评估exprB,然后执行|。

exprA || exprB <——这意味着评估exprA,只有当这是假的,然后评估exprB,并执行||。

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

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

&和&&之间有两个区别。

如果他们使用逻辑与

&和&&可以是逻辑与,当&或&&左右表达式结果全部为真时,整个运算结果可以为真。

当&和&&作为逻辑与时,有区别:

当使用&&作为逻辑与时,如果左边的表达式结果为假,右边的表达式将不会执行。

举个例子:

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。更精确地说,“&”运算符如果两位中的任何一位为1,则返回1,如果其中任何一位为0,则返回0。

来自维基页面:

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

除了对两个操作数求值不是一个懒惰的求值器之外,我认为位操作符的主要特征是比较操作数的每个字节,如下例所示:

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