繁体   English   中英

Java布尔表达式行为

[英]Java Boolean expression behavior

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

我的问题只是试图通过以下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,然后使用&&,导致打印。 操作规则的顺序是否被忽略,布尔表达式是从左到右执行的? 增量运算符是否导致不规则行为?

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

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

&&|| 运算符对两个布尔表达式执行条件AND条件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右操作数( 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);

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

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

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

请注意,短路可以用于您的优势(例如,检查||&&左侧是否为(非) null值)或者它可能会使您混淆(就像您在问题中所做的那样)。 明智地使用它,年轻的padawan。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM