Java布尔表达式行为

时间:2012-08-07 01:28:56

标签: 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);
   }
}

输出是: 短 13

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

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

5 个答案:

答案 0 :(得分:6)

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

  

&&||运算符对两个布尔表达式执行 Conditional-AND Conditional-OR 运算。这些操作员表现出短路"行为,这意味着仅在需要时才评估第二个操作数。


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

total > 4 || ++num > 15 && total > 0

由于total > 4的计算结果为true,因此条件的计算结果为true,并立即采用if分支,而不是评估条件的其余部分。

如果您将total更改为等于4,则短路OR的左操作数(total > 4)为false,因此它会评估右侧 - 操作数(++num > 15 && total > 0)。

如果将num更改为等于15,则短路AND左操作数(++num > 15)将评估为true,从而最终评估AND权限-operand(total > 0)确定条件是否为true。如果total > 0为false,则条件也为false

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

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

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

答案 1 :(得分:4)

通过使用double或(||),激活java的短路; (使用单个|如果你不想要这个)。一旦它达到一切都是真的,并且它遇到短路或(||),(或某些事情是错误的,它会碰到一个短路&(&&)),它就会爆发。所以在你的情况下,total大于4,所以它停在那里(由于||),并返回true到if语句,并打印出short;它永远不会到达增加num变量的部分,因为它看不需要检查

答案 2 :(得分:3)

发生了什么short-circuit evaluationtotal > 4true,构成整个条件true。我们甚至不需要在||之后查看后面的内容。这是一种非常常见的运行时优化,也存在于C,C ++和Javascript(以及许多其他)中。你观察到了它的副作用。

请注意,短路可以对您有利(例如,检查||&&左侧的(非)null值或者它可以让你困惑(就像你在问题中所做的那样)。明智地使用它,年轻的padawan。

答案 3 :(得分:0)

计算机将在你的布尔表达式下像这个总> 4 || (++ num> 15&& total> 0)。它就像标准SQL中的表达式。它找到&&并在左侧和右侧抓住2个表达式,然后像我刚才那样把它们放在一个括号中。 在您的代码中,total = 9> 4和++ num = 14< 15< 15> 0,因此结果为true ||(false&& true)= true。 终端打印出“short”和num,即13。

希望我的回答能帮到你。 如果我错了,请纠正我

答案 4 :(得分:0)

我认为在if子句中使用时它不会改变变量的实际值。存储在存储器中的值保持不变。它就像表达式

中的num + 1> 15