【问题标题】:Why does this code goes into infinite loop? [duplicate]为什么这段代码会进入无限循环? [复制]
【发布时间】:2014-02-13 07:37:12
【问题描述】:

考虑以下代码:

public class Game {

    public static void main(String[] args) {

        int x = 0;
        while (x < 1) {
          x = x++;
        }

    }

}

使用我的编译器,这段代码会进入无限循环,但为什么呢?

首先,我们将 x 的值放入 x ,然后 only 然后我们将 1 添加到 x ,然后我预计 1 &lt; 1 将是 false ,并且while 循环将终止 ...

但是不,这不会发生。

那么无限循环的原因可能是什么?

【问题讨论】:

  • 对于调试器来说听起来像是一个很好的问题。一步一步通过它。或者在里面放一些日志语句。
  • x=x++; 保持 x 不变 - 你增加它,然后用旧值(增加之前的值)替换它。
  • -1 不签出“相关”(第二个问题包含答案)
  • 特别是当你说“首先,我们将 x 的值放入 x 中,然后才将 x 加 1”时,你似乎感到困惑。确实,从词法上讲,赋值在增量之前,但是赋值右侧的值必须在赋值发生之前计算出来。 (该值是 x 的 old 值,因为增量是 post-increment)。

标签: java loops while-loop


【解决方案1】:

表达式x++ 是一个后增量,这意味着表达式的值是旧值0,然后将其分配回x,因此x 始终是0x = x++;之后。

要跳出无限循环,不要将其分配回x,保持x1的后增量值不变:

while (x < 1) {
   x++;
}

【讨论】:

    【解决方案2】:

    x++ 几乎等同于

    some-temporary = x;
    x = x + 1;
    now use the value of some-temporary
    

    所以x = x++; 等价于

    some-temporary = x;
    x = x + 1;
    x = some-temporary;
    

    所以你应该可以看到为什么加1的部分没有效果。

    【讨论】:

      【解决方案3】:

      这是因为x 在被使用后会增加。因此,发生的扩展操作序列将是:

      1. oldX = x
      2. x++,即x = x + 1
      3. x = oldX

      oldX 是一个虚构的变量。

      发生的情况是x 总是被分配oldX,在我们的例子中是0,导致无限循环。 x++ 部分将被忽略。

      解决方案:将x = x++ 替换为x++,或者,如果您真的 需要,x = ++x

      【讨论】:

        【解决方案4】:

        x = x++ 不会做你想做的事。将其替换为x++

        x++ 等同于x = x + 1,所以你的分配没有意义。

        可以在此处的答案中找到有关此问题的更多信息:

        Why does this go into an infinite loop?

        【讨论】:

        • 我就是这个意思:x = x++;
        • @ron 与 t = x + 1 相同; x = x;
        • 不,@ron,你的意思是x = x + 1;,但是你选择写它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        • 2013-04-25
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多