【问题标题】:Conditional operator behaviour条件运算符行为
【发布时间】:2013-05-10 23:01:21
【问题描述】:

谁能解释一下下面代码输出背后的逻辑?

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

【问题讨论】:

  • && 具有比 || 更高的优先级,因此表达式被括为 (true || (false && false))((false && true) || true)。你可以从那里解决它。
  • 这是正确的bmanolov.free.fr/javaoperators.php 不用说,在实际程序中编写其中任何一个都是自找麻烦;括号总是好的

标签: java conditional operator-keyword


【解决方案1】:

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

||(或) - 加法

&&(and) - 乘法

这就是 && 比 || 具有更高优先级的原因

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

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

【讨论】:

    【解决方案2】:

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

    false && true||true 可以简化为 true 以便打印该行。 false && true 的计算结果为 false,但由于有一个 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;
    }
    

    【讨论】:

    • @user2388736 正如 dlev 所说。但是在你用括号括起来之后,它会从左到右进行计算。
    • 我希望我知道为什么我会为此疯狂投票。有人给出反对的理由。
    【解决方案3】:

    如果您查看this Operator precedence table,您会发现&& 的优先级高于||

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

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

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

    【讨论】:

    • @Keppil 非常感谢他以非常简单的方式解释它。非常基本的东西,但它仍然让我挠头。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-01
      • 2012-04-27
      • 2010-12-16
      • 1970-01-01
      • 2017-02-06
      • 2012-02-12
      • 2011-04-05
      • 1970-01-01
      相关资源
      最近更新 更多