【问题标题】:In Java, what are the boolean "order of operations"?在 Java 中,布尔“操作顺序”是什么?
【发布时间】:2011-01-16 20:17:54
【问题描述】:

让我们以对象Cat 为例。我想确定“not null”cat 是橙色还是灰色。

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}

我相信 AND 首先出现,然后 OR。不过我有点模糊,所以这是我的问题:

  1. 有人可以指导我完成此声明,以便我确定会发生什么吗?

  2. 另外,如果我添加括号会发生什么;这会改变操作顺序吗?

  3. 我的操作顺序会因语言而异吗?

【问题讨论】:

  • 如果您有一点模糊,请加上括号,这样一目了然。
  • 即使对你来说并不模糊,也要加上括号,以便其他人也能理解。
  • 来自关于布尔逻辑的维基百科:在这种[歧义]的情况下,可以使用括号来阐明操作的顺序。与往常一样,最里面的对中的操作首先执行,然后是下一个对,依此类推,直到完成括号内的所有操作。然后执行括号外的任何操作。
  • 可能是众多 StackOverFlow 巨魔之一。别担心。我觉得你的回答也不错。
  • 您很可能想使用 cat.getColor().equals("orange") 而不是 '=='。

标签: java logic boolean evaluation operator-precedence


【解决方案1】:

运算顺序不是您需要的,您需要布尔代数,这包括布尔函数。最大项/最小项、格雷码、卡诺表、二极管、晶体管、逻辑门、多路复用器、比特加法器、触发器... 您想要的是在计算机或虚拟机上实现布尔“逻辑”。使用“操作顺序”,您可能会参考一些有关物理的内容,例如管理逻辑门(OR,if)纳秒间隔上的延迟?

【讨论】:

    【解决方案2】:

    首先,您的 if 语句包含三个主要表达式:

    1. 猫!=空
    2. cat.getColor() == "橙色"
    3. cat.getColor() == "灰色"

    第一个表达式只是检查 cat 是否不为空。这是必要的,否则第二个表达式将被执行并导致NPE(null pointer excpetion)。这就是为什么在第一个和第二个表达式之间使用 && 的原因。当您使用&& 时,如果第一个表达式的计算结果为假,则永远不会执行第二个表达式。 最后你检查一下猫的颜色是不是灰色的。

    最后请注意,您的 if 语句是 仍然错误,因为如果 cat 是 null,第三个表达式仍然是 执行,因此你得到一个 null 指针异常

    正确的做法是:

    if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) { 
    //do stuff 
    } 
    

    检查括号的顺序。

    【讨论】:

      【解决方案3】:

      是的,&& 肯定会在 || 之前进行评估。但我看到你在做cat.getColor() == "orange",这可能会给你带来意想不到的结果。您可能想要这样做:

      if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
          //do stuff
      }
      

      【讨论】:

        【解决方案4】:

        表达式基本等同于:

        if ( (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") {
          ...
        }
        

        这里的优先顺序是 AND (&&) 的优先级高于 OR (||)。

        您还应该知道,使用== 来测试字符串是否相等有时在 Java 中可以工作,但您不应该这样做。你应该这样做:

        if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
          ...
        }
        

        即使用equals() 方法进行String 比较,而不是简单地引用相等的==。字符串的引用相等可能会产生误导。例如:

        String a = new String("hello");
        String b = new String("hello");
        System.out.println(a == b); // false
        

        【讨论】:

        • 我认为您在第一个示例中缺少括号,或者我太累了。
        【解决方案5】:

        Java 教程有一个说明operator precedence 的列表。将首先评估相等运算符,然后是 &&,然后是 ||。括号将在其他任何内容之前进行评估,因此添加它们可以更改顺序。这通常在不同语言之间几乎相同,但仔细检查总是一个好主意。

        您没有预料到的行为的微小变化会导致您花费一整天的时间进行调试,因此最好将括号放在适当的位置,这样您就可以确定评估的顺序是什么。

        【讨论】:

        • @VinceEmigh 操作数不必按照与运算符优先级相同的顺序进行计算。即使添加括号,程序仍然可以看到if(true || (true && s.equals(""))) 将始终为true,因此它根本不需要评估s.equals("")
        • 我的错,我刚刚意识到我大错特错了。我没有正确考虑优先级。我在考虑评估(首先被评估),如运算符“拥有”布尔值
        【解决方案6】:

        布尔运算顺序(我相信所有语言):

        1. 括号
        2. 不是

        所以你上面的逻辑相当于:

        (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"
        

        【讨论】:

          猜你喜欢
          • 2011-01-16
          • 2018-07-06
          • 1970-01-01
          • 2014-12-28
          • 2011-04-17
          • 2022-11-29
          • 1970-01-01
          • 2010-10-14
          • 2014-05-23
          相关资源
          最近更新 更多