我一直认为Java中的&&操作符用于验证其布尔操作数是否为真,并且&操作符用于对两个整数类型进行逐位操作。
最近我知道&运算符也可以用来验证它的两个布尔操作数是否为真,唯一的区别是即使LHS操作数为假,它也会检查RHS操作数。
Java中的&操作符内部重载吗?或者这背后还有其他的概念吗?
我一直认为Java中的&&操作符用于验证其布尔操作数是否为真,并且&操作符用于对两个整数类型进行逐位操作。
最近我知道&运算符也可以用来验证它的两个布尔操作数是否为真,唯一的区别是即使LHS操作数为假,它也会检查RHS操作数。
Java中的&操作符内部重载吗?或者这背后还有其他的概念吗?
当前回答
如JLS(15.22.2)中所述:
When both operands of a &, ^, or | operator are of type boolean or Boolean, then the type of the bitwise operator expression is boolean. In all cases, the operands are subject to unboxing conversion (§5.1.8) as necessary. For &, the result value is true if both operand values are true; otherwise, the result is false. For ^, the result value is true if the operand values are different; otherwise, the result is false. For |, the result value is false if both operand values are false; otherwise, the result is true.
“诀窍”在于&是一个整数位运算符,也是一个布尔逻辑运算符。为什么不呢,把这个作为运算符重载的例子是合理的。
其他回答
所有的答案都很棒,似乎不需要更多的答案了 但我只是想指出关于&&算子的一些东西,叫做依赖条件
在使用运算符&&的表达式中,一个条件——我们称之为依赖条件——可能需要另一个条件为真,以使依赖条件的求值有意义。
在这种情况下,依赖条件应该放在&&运算符之后以防止错误。
考虑表达式(i != 0) && (10 / i == 2)。依赖条件(10 / i == 2)必须出现在&&运算符之后,以防止被零除的可能性。
另一个例子(myObject != null) && (myObject. getvalue () == somevaluse)
还有一件事:&&和||被称为短路求值,因为只有当第一个参数不足以确定表达式的值时,才会执行或求值第二个参数
参考资料:Java™如何编程(早期对象),第十版
对于AND运算符和OR运算符,Java有两类求值,即Short-Circuit求值和full求值。
&& ||短路评估
短路求值使您可以不计算AND和OR表达式的右边,当整体结果可以从左边的值预测时。
int numberOne = 1;
int numberTwo = 2;
boolean result = false;
// left-side is false so the the overall result CAN be predicted without evaluating the right side.
// numberOne will be 1, numberTwo will be 2, result will be false
result = (numberOne > numberTwo) && (++numberOne == numberTwo);
System.out.println(numberOne); // prints 1
System.out.println(numberTwo); // prints 2
System.out.println(result); // prints false
// left-side is true so the the overall result CAN NOT be predicted without evaluating the right side.
// numberOne will be 2, numberTwo will be 2, result will be true
result = (numberTwo > numberOne) && (++numberOne == numberTwo);
System.out.println(numberOne); // prints 2
System.out.println(numberTwo); // prints 2
System.out.println(result); // prints true
^全面评估
虽然在某些情况下可以预测结果,但有必要计算右边的值。
int numberOne = 1;
int numberTwo = 2;
boolean result = false;
// left-side is false so the the overall result will be false BUT the right side MUST be evaluated too.
// numberOne will be 2, numberTwo will be 2, result will be false
result = (numberOne > numberTwo) & (++numberOne == numberTwo);
System.out.println(numberOne); // prints 2
System.out.println(numberTwo); // prints 2
System.out.println(result); // prints false
注意:
Notice that for XOR (^) there is no short-circuit, because both sides are always required to determine the overall result. Notice that other possible names for Short-Circuit evaluation are minimal evaluation and McCarthy evaluation. It is not recommenced to mix boolean logic and actions in the same expression & can also act as a Bitwise AND operator which is very academic and can be used in cryptography. When both bits are 1, the result is 1, or either of the bits is not 1, the result is 0. (Check the following code)
AND位的例子:
byte a = 5; // 00000101
byte b = 3; // 00000011
byte c = (byte) (a & b); // 00000001 (c is 1)
' && ': -是一个逻辑与运算符,根据其参数的逻辑关系产生一个布尔值true或false。
例如:—Condition1 && Condition2
如果Condition1为假,那么(Condition1 && Condition2)将始终为假,这就是为什么这个逻辑运算符也被称为短路运算符的原因,因为它不计算另一个条件。如果条件1为假,则不需要计算条件2。
如果条件1为真,则评估条件2,如果它为真,则总体结果为真,否则为假。
' & ': -是位与运算符。如果两个输入位都为1,则在输出中产生1(1)。否则产生0(0)。
例如:-
int = 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
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
除了对两个操作数求值不是一个懒惰的求值器之外,我认为位操作符的主要特征是比较操作数的每个字节,如下例所示:
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