在Java中,布尔的“操作顺序”是什么?

时间:2010-02-15 02:00:28

标签: java logic boolean evaluation operator-precedence

我们来看一个对象Cat的简单示例。我想确定“not null”cat是橙色还是灰色。

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

我相信AND先来,然后是OR。我有点模糊,所以这是我的问题:

  1. 有人可以引导我完成这个陈述,所以我确定会发生什么事情?

  2. 此外,如果我添加括号会发生什么;这会改变运营的顺序吗?

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

6 个答案:

答案 0 :(得分:58)

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

这是你不期望的行为的微小变化会导致你花一整天的时间进行调试,所以把括号放在适当位置是个好主意,这样你就可以确定评估的顺序是什么。

答案 1 :(得分:16)

布尔操作顺序(我相信所有语言):

  1. 括号
  2. 不是
  3. 所以你上面的逻辑等同于:

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

答案 2 :(得分:8)

表达式基本上与:

相同
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

答案 3 :(得分:4)

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

  1. cat!= null
  2. cat.getColor()==“orange”
  3. cat.getColor()==“gray”
  4. 第一个表达式只检查cat是否为null。否则第二个表达式将被执行,并将导致NPE(null pointer excpetion)。这就是为什么使用&&在第一个和第二个表达式之间。使用&&时,如果第一个表达式的计算结果为false,则永远不会执行第二个表达式。 最后,检查猫的颜色是否为灰色。

      

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

    正确的做法是:

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

    检查括号的顺序。

答案 4 :(得分:3)

是的&&肯定是在||之前评估的。但我发现你正在做cat.getColor() == "orange"这可能会给你意想不到的结果。你可能想要这样做:

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

答案 5 :(得分:-3)

操作顺序不是你需要的,你需要布尔代数,这包括布尔函数。 Maxterms / minterms,格雷码,卡诺表,二极管,晶体管,逻辑门,多路复用器,bitadders,触发器...... 你想要的是在计算机或虚拟机上实现布尔“逻辑”。对于“操作顺序”,你可以参考一些关于物理的东西,比如管理逻辑门上的延迟(OR,if)纳秒间隔?