[英]Why &= operator doesn't work the same as &&
我只是很好奇java是如何工作的。 有人可以解释为什么在案例1中调用getBoolean
而不在案例2中调用getBoolean
吗?
public class Main {
public static void main(String[] args) {
System.out.println("---------- Case 1 ----------");
boolean b = false;
b &= getBoolean(true);
System.out.println("---------- Case 2 ----------");
b = false;
b = b && getBoolean(true);
}
private static boolean getBoolean(boolean bool) {
System.out.println("getBoolean(" + bool + ") was called\n");
return bool;
}
}
输出:
---------- Case 1 ----------
getBoolean(true) was called
---------- Case 2 ----------
b &= a
是b = b & a
的快捷方式,而不是b = b && a
这是因为&
和&&
运算符之间的差异。
&
运算符始终会评估条件的两端。
&&
运算符仅在需要时评估第二个。
因此, getBoolean(true)
将不会在getBoolean(true)
情况下运行。
在情况2中, getBoolean(true);
不评估,因为&&
是短路运算符,例如,如果表达式为false
它将停止评估
情况1仅将getBoolean()
方法的结果设置为b
变量。
更新,感谢@KisHan:
请注意, b &= a
等于b = b & a
而不是b = b && a
在第二种情况下, b
为false
而对于&&
如果第一个条件为假,它将不会继续前进。
b = b && getBoolean(true);//b is false
因此&&
(逻辑与)首先检查操作的左侧(如果true
,然后continues
右侧。
而&
(按位与)运算符计算表达式的两边,因为它的按位左侧和右侧右侧之间AND operator.As它进行与运算。
所以在第一种情况下
b = b & getBoolean(true);//will perform AND operation to evaluate Expression
在第一种情况下,它是按位的并尝试获取分配的值( getBoolean()
)。
在第二种情况下,&&进行short circuit evaluation
。 如果第一个表达式为假,则第二个表达式不计算。
仅在第一个参数不足以确定表达式的值的情况下,才执行或评估第二个参数:
b = b && getBoolean(true); // b already false and there is no use even getBoolean(true) is true or false , because the result is already false as b is false.
&
装置逐位AND:上的位逐位水平,它设置在输出到true
如果两个输入位的是真实的。 &&
表示逻辑AND:如果两个输入均为真,则表达式返回true。 &&
也在短路(停止评估并在第一个输入为假时立即返回false),这就是您在此处看到的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.