条件运算符行为

时间:2013-05-16 06:57:05

标签: java conditional operator-keyword

有人可以解释下面代码输出背后的逻辑吗?

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

4 个答案:

答案 0 :(得分:5)

如果您查看this Operator precedence table,可以看出&&的优先级高于||

因此,这两个表达式的评估如下:

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

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

答案 1 :(得分:1)

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

false && true||true可以简化为true,因此可以打印该行。 false && true的计算结果为false,但由于存在或遗留,它会评估其他方面。事实证明这是真的。自false||true == 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;
}

答案 2 :(得分:1)

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

如果您希望表达清晰明了,可以随时在x && y部分放置括号。

答案 3 :(得分:0)

首先,如果在编译时消除了这些情况,只要结果是恒定的。

||(或) - 添加

&&(和) - 乘法

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

因此,优先级表达式等于:

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