我只是好奇java是如何工作的。有人可以解释为什么在案例1中调用getBoolean
而在案例2中没有调用?
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 ----------
答案 0 :(得分:5)
b &= a
是b = b & a
不是b = b && a
这是因为&
和&&
运算符之间存在差异。
&
运算符始终评估条件的两个方面。
&&
运算符仅在需要时评估秒。
因此,getBoolean(true)
不会在第二种情况下运行。
答案 1 :(得分:4)
在案例2中,getBoolean(true);
未被评估,因为&&
是短路运算符,例如如果表达式为false
则停止评估
案例1只是将getBoolean()
方法的结果设置为b
变量。
更新,感谢@KisHan:
请注意,b &= a
等于b = b & a
而不是b = b && a
答案 2 :(得分:3)
第二种情况b
为false
,&&
如果第一种情况为假,则不会向前移动。
b = b && getBoolean(true);//b is false
所以&&
(逻辑与)首先检查操作的左侧,如果它是true
而不是它continues
到右侧。
虽然&
(按位AND)运算符计算表达式的两侧,因为它是bitwise AND运算符。它在左侧和右侧之间执行AND运算。
所以在第一种情况下它将是
b = b & getBoolean(true);//will perform AND operation to evaluate Expression
答案 3 :(得分:2)
在第一种情况下,它按位并尝试获取指定值(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.
答案 4 :(得分:1)
&
表示按位AND:在逐位级别,如果两个输入位都为真,则将输出设置为true
。 &&
表示逻辑AND:如果两个输入都是真实的,则表达式返回true。 &&
也是短路的(如果第一个输入是假的,则停止评估并立即返回false),这就是你在这里看到的。