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

Ste*_*ano 58 java evaluation logic boolean operator-precedence

我们来看一个对象的简单例子Cat.我想确定"not null" cat是橙色还是灰色.

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 有人可以引导我完成这个陈述,所以我确定我会得到什么?

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

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

Bil*_*ard 60

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

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


Tre*_*ner 20

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

  1. 括号
  2. 要么

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

(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"
Run Code Online (Sandbox Code Playgroud)


cle*_*tus 8

表达式基本相同:

if ( (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

您还应该知道,使用==测试字符串相等性有时可以在Java中工作,但这不是您应该如何操作的.你应该做:

if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false
Run Code Online (Sandbox Code Playgroud)


Sur*_*ran 5

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

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

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

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

正确的做法是:

if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) { 
//do stuff 
} 
Run Code Online (Sandbox Code Playgroud)

检查括号的顺序。


fas*_*ava 5

&&肯定是评价过呀||。但是我看到您正在做的事情cat.getColor() == "orange"可能会给您带来意想不到的结果。你可能想要这个:

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