2

任何人都可以解释以下代码输出背后的逻辑吗?

    if(true||false&&false){
        System.out.println("right to left ");
    }
    if (false && true||true){
        System.out.println("left to right");
    }
4

4 回答 4

5

如果您查看此运算符优先级表,您会发现它&&的优先级高于||.

因此,这两个表达式的计算方式如下:

true || false && false== true || (false && false)==true

false && true || true == (false && true) || true ==true

于 2013-05-16T07:04:10.020 回答
1

&&Java 为and赋予了不同的运算符优先级||。这意味着你的表达式可以写成true || (false && false)and (false && true) || true。当您在布尔表达式中看到“或真”时,它始终为真。这就是打印两个字符串的原因。

如果你想让你的表达清楚,你总是可以在x && y零件周围加上括号。

于 2013-05-16T07:04:17.280 回答
1

if(true||false&&false)可以简化为 true 以便打印该行。它可以简化为 true,因为您true在左侧有 a 。由于它||的右侧有一个或/,并且事情已经是真实的,这意味着它可以短路而不评估其余部分。您可以通过获取false&&false,将其放入自己的方法中,然后在返回之前打印一行来向自己证明这一点。你会看到它没有打印出来。那是因为(false && false)甚至没有评估。

false && true||true可以简化为 true 以便打印该行。thefalse && true评估为假,但由于有一个 or 剩余,它评估它的另一面。事实证明这是真的。因为false||true== true,所以计算结果为真。不过这里没有短路。您可以通过将其提取false && true到自己的方法中并在第一行打印一些内容来证明这一点。你会看到它打印:

public static void main(String args[]) {
    if(true|| doSomething()){
        System.out.println("right to left ");
    }
    if (doSomethingElse() ||true){
        System.out.println("left to right");
    }

}

private static boolean doSomething() {
    System.out.println("do something"); //this does NOT print
    return false&&false;
}

private static boolean doSomethingElse() {
    System.out.println("do something else");    //this DOES print
    return false && true;
}
于 2013-05-16T06:58:22.887 回答
0

首先,如果在编译时消除这种情况,只要结果是不变的。

||(或) - 加法

&&(and) - 乘法

这就是为什么 && 的优先级高于 ||

所以按优先级表达式等于:

true + (false * false)(false * true) + true

于 2013-05-16T07:23:47.207 回答