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

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

Java中的&操作符内部重载吗?或者这背后还有其他的概念吗?


当前回答

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

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

其他回答

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

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

这取决于参数的类型……

对于整数参数,单个&号(“&”)是“逐位AND”操作符。双&号(“&&”)只用于两个布尔参数。

对于布尔参数,单个&号构成(无条件)“逻辑与”运算符,而双&号(“&&”)是“条件逻辑与”运算符。也就是说,单&号总是计算两个参数,而双&号只在第一个参数为真时计算第二个参数。

对于所有其他参数类型和组合,应该发生编译时错误。

几乎所有的答案都很好地涵盖了每一个比较点。我只想再举一个例子。以演示输出如何根据所使用的操作符而变化。考虑下面的例子

int a = 10;
if(++a==10 & ++a==12) {
    ++a;
}
System.out.println(a); //12

在上面的代码中,我们使用了按位&运算符。因此,它将计算两个参数(左和右),而不考虑单个结果。

所以a会在if条件内增加2倍。但是由于条件不会变为true,它不会进入if循环内部,第三个增量也不会发生。所以a的最终值在这里是12。

现在假设,在上面的同一个例子中,如果我们使用短路&&运算符。然后在将++a==10赋值为false后,它将不会去检查第二个参数。这就是未来11人的最终价值。

int a = 10;
if(++a==10 && ++a==12) {
    ++a;
}
System.out.println(a); //11

基于此,我们可以说,与短路&&算子相比,位&算子的性能相对较低。位运算符将对两个参数求值,而不考虑第一个参数的结果。而&&运算符将停止计算第二个参数,如果第一个参数的结果为假。

这两者之间的另一个区别是,Bitwise &操作符适用于布尔型以及整型。而短路&&运算符仅适用于布尔类型。

我们可以写

System.out.println(4 & 5); // 4

但如果我们试着这样写,

System.out.println(4 && 5);

然后它会给出一个错误,

二元运算符'&&'的错误操作数类型

&是位运算符加号,用于检查两个条件,因为有时我们需要同时计算两个条件。 但是,当第一个条件为真时,逻辑运算符&&则进入第二个条件。

除了&&和||是短路外,在混合这两种形式时,还要考虑运算符优先级。 我认为每个人都不会立即看出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