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

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

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

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

  1. 有人可以通过这个陈述走我,所以我敢肯定,我会得到什么发生?

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

  3. 我的操作顺序是否会从语言变为语言?

Java教程有一个说明运算符优先级的列表。 平等运算符将被评估,然后&& ,然后|| 。 括号将在任何其他之前被评估,所以添加它们可以改变顺序。 从语言到语言,这通常是几乎相同的,但仔细检查总是一个好主意。

这是行为的微小变化,您不希望这会导致您花费整整一天的时间进行debugging,所以最好将括号放在适当的位置,以确定评估的顺序。

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

  1. 括号
  2. 要么

所以你上面的逻辑等价于:

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

expression式基本上与以下内容相同:

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

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

你也应该知道,使用==来testingstring的平等有时会在Java中工作,但这不是你应该怎么做的。 你应该做:

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

即使用equals()方法进行String比较,而不是== ,它只是引用相等。 string的引用相等可能会引起误解。 例如:

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

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

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

首先,你的if语句包含三个主要expression式:

  1. cat!= null
  2. cat.getColor()==“orange”
  3. cat.getColor()==“gray”

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

最后注意你的if语句仍然是错误的,因为如果cat为null,第三个expression式仍然被执行,因此你得到一个空指针exception

正确的做法是:

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

检查括号的顺序。

操作顺序不是你所需要的,你需要布尔代数,这包括布尔函数。 最大/最小值,格雷码,卡诺表,二极pipe,晶体pipe,逻辑门,多路复用器,bitadders,触发器…你想要的是在计算机或虚拟机上实现布尔逻辑。 有了“操作顺序”,你可能会提到一些关于物理的东西,比如pipe理逻辑门的延迟(或者如果是)纳秒的时间间隔?