繁体   English   中英

为什么&=运算符不能与&&相同

[英]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 &= ab = 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

在第二种情况下, bfalse而对于&&如果第一个条件为假,它将不会继续前进。

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM