5

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

我的问题只是想了解以下 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);
   }
}

输出为:short 13

很明显 ++num 没有执行。如果遵守了严格的操作顺序,那应该是第一件事。它没有。所以接下来是&&。如果 && 是按照 || 的优先顺序完成的,那么同样... ++num 应该首先发生。它没有。所以,对我来说,输出似乎是由 || 决定的。首先执行,将 ++num 短路,然后与 && 一起使用,导致打印短路。是否只是忽略了运算规则的顺序,而布尔表达式从左到右执行?增量运算符是否导致不规则行为?

感谢您提供有关此代码实际情况的任何见解。

4

5 回答 5

6

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

&&and运算符对两个布尔表达式||执行条件与条件或运算。这些运算符表现出“短路”行为,这意味着仅在需要时才评估第二个操作数。


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

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

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

如果更改total为 equal 4,则total > 4短路 OR 的左操作数 ( ) 是false,因此它计算右操作数 ( ++num > 15 && total > 0)。

如果更改num为 equal 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);

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

于 2012-08-07T01:32:10.180 回答
4

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

于 2012-08-07T01:31:59.537 回答
3

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

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

于 2012-08-07T01:32:51.690 回答
0

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

希望我的回答对你有所帮助。如果我错了,请纠正我

于 2012-08-07T01:38:01.400 回答
0

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

于 2012-08-07T04:58:04.690 回答