Java布尔表达式行为

use*_*609 5 java boolean

这是我在这里发表的第一篇文章,请原谅任何协议错误.

我的问题只是试图通过以下Java代码了解正在发生的事情.我完全理解括号的使用会澄清一切,但结果输出似乎是在面对有关Java操作顺序的约定时出现的.

public class Tester
{
   public static void main(String[] args)
   {
    int total=9, num=13;
    if (total>4 || ++num>15 && total>0)
    {
           System.out.println("short");
    }
    System.out.println(num);
   }
}
Run Code Online (Sandbox Code Playgroud)

输出为:短13

显然++ num没有执行.如果观察到严格的操作顺序,它应该是第一件事.它没有.接下来就是&&.如果&&按优先顺序超过||完成,则相同的...... ++ num应首先发生.它没有.所以,对我而言,似乎输出是用||确定的 首先执行,接++ num,然后使用&&,导致打印.操作规则的顺序是否被忽略,布尔表达式是从左到右执行的?增量运算符是否导致不规则行为?

感谢您对此代码实际发生的任何见解.

old*_*inb 6

这与优先级/关联性(它处理如何解析表达式)无关......这与Java评估顺序有关 - 这是从左到右.您似乎误解了短路逻辑的工作原理.

&&||运营商进行有条件-AND条件,或在两个布尔表达式运算.这些运算符表现出"短路"行为,这意味着仅在需要时才评估第二个操作数.


现在,让我们尝试逐步评估这个表达式......

total > 4 || ++num > 15 && total > 0
Run Code Online (Sandbox Code Playgroud)

由于total > 4求值为true,条件求值为,true并且if立即采用分支而不是评估条件的其余部分.

如果total改为n 4,则total > 4短路OR 的左操作数()为false,因此它评估右操作数(++num > 15 && total > 0).

如果更改num为相等15,则短路AND左操作数(++num > 15)求值true,从而最终计算AND右操作数(total > 0)以确定条件是否为true.如果total > 0是假,那么条件也是false.

下面是为了清晰起见而重写的代码,以突出显示流程.

if (total > 4) {
  System.out.println("short");
} else {
  if (++num > 15) {
    if (total > 0) {
      System.out.println("short");
    }
  }
}
System.out.println(num);
Run Code Online (Sandbox Code Playgroud)

您可以在相关的Java Tutorial中阅读有关Java条件运算符的更多信息.

  • 哇!我以为我读了整篇文章,但你的代码很棒.所以AND真的永远不会被访问.我从来没有想到这就是发生的事情.谢谢转发! (2认同)