我们来看一个对象Cat
的简单示例。我想确定“not null”cat
是橙色还是灰色。
if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}
我相信AND先来,然后是OR。我有点模糊,所以这是我的问题:
有人可以引导我完成这个陈述,所以我确定会发生什么事情?
此外,如果我添加括号会发生什么;这会改变运营的顺序吗?
我的操作顺序是否会因语言而异?
答案 0 :(得分:58)
Java教程有一个列出operator precedence的列表。首先评估相等运算符,然后&&
,然后||
。括号将在其他任何内容之前进行评估,因此添加它们可以更改顺序。从语言到语言,这通常几乎相同,但仔细检查总是一个好主意。
这是你不期望的行为的微小变化会导致你花一整天的时间进行调试,所以把括号放在适当位置是个好主意,这样你就可以确定评估的顺序是什么。
答案 1 :(得分:16)
布尔操作顺序(我相信所有语言):
所以你上面的逻辑等同于:
(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语句包含三个主要表达式:
第一个表达式只检查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)纳秒间隔?