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

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

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


当前回答

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

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

其他回答

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

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

所有的答案都很棒,似乎不需要更多的答案了 但我只是想指出关于&&算子的一些东西,叫做依赖条件

在使用运算符&&的表达式中,一个条件——我们称之为依赖条件——可能需要另一个条件为真,以使依赖条件的求值有意义。

在这种情况下,依赖条件应该放在&&运算符之后以防止错误。

考虑表达式(i != 0) && (10 / i == 2)。依赖条件(10 / i == 2)必须出现在&&运算符之后,以防止被零除的可能性。

另一个例子(myObject != null) && (myObject. getvalue () == somevaluse)

还有一件事:&&和||被称为短路求值,因为只有当第一个参数不足以确定表达式的值时,才会执行或求值第二个参数

参考资料:Java™如何编程(早期对象),第十版

' && ': -是一个逻辑与运算符,根据其参数的逻辑关系产生一个布尔值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

对于布尔值,两者之间没有输出差异。你可以交换&&和&或||和|,它永远不会改变表达式的结果。

区别在于处理信息的场景背后。当你对a= 0和b = 1的表达式“(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 != 0)当a= 0和b = 1时,会发生以下情况:

a != 0 -->false
expression returns false

更少的步骤,更少的处理,更好的编码,特别是在处理许多布尔表达式或复杂的参数时。

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

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