为啥这段代码会进入无限循环? [复制]

Posted

技术标签:

【中文标题】为啥这段代码会进入无限循环? [复制]【英文标题】: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)。 【参考方案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 在被使用后会增加。因此,发生的扩展操作序列将是:

    oldX = x x++,即x = x + 1 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;,但是你选择写它。

以上是关于为啥这段代码会进入无限循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码不会导致无限循环?

为啥我在 React JS 中的代码会进入满足这两个条件的无限循环?

为啥我没有进入 React 无限重新渲染循环?

有人能告诉我为啥这个方法会进入无限循环吗?

即使没有进入无限循环,这段代码似乎也永远无法解决

为啥即使我修改了 lock 变量,我也会得到一个无限的 while 循环? [复制]