为啥这会导致无限循环

Posted

技术标签:

【中文标题】为啥这会导致无限循环【英文标题】:Why does this cause an infinite loop为什么这会导致无限循环 【发布时间】:2013-06-17 21:43:51 【问题描述】:

考虑这个简单的代码:

 // E1 
  public void doTest(String pattern) 
    int counter = 0;

    while (counter < 3) 
        counter = counter++;
    
    System.out.println("Done");

这会导致无限循环。

但是,如果增加计数器的语句是这样写的:

E2.  counter = ++counter;

或者这个

E3.    counter++;

它正常终止。我知道递增发生在失败的版本中的分配之后,这解释了 E2 的工作原理,但我认为 java 分配了变量中递增的结果,该变量在 E3 中递增。所以我很困惑为什么 E1 失败但 E3 没有。

【问题讨论】:

你知道如何使用调试器吗?这是一个很棒的工具,可以帮助你理解这样的代码是如何工作的。 ***.com/questions/3831341/… Is there a difference between x++ and ++x in java?的可能重复 【参考方案1】:
counter = counter++;

以上代码对counter没有影响。它实际上与:

int temp = counter;
counter++;
counter = temp;

所以,counter 的值根本没有改变。

另一方面,如果你使用:

counter = ++counter;

计数器先递增,然后重新分配给计数器。本质上,您可以简单地忽略分配部分,并简单地保留它:

counter++; // Or ++counter

【讨论】:

@Elliott,您可以通过阅读此处的帖子和前增量来进一步理解这一点:en.wikipedia.org/wiki/Increment_and_decrement_operators【参考方案2】:

问题是循环体末尾的counter的值和开头的一样。语句counter = counter++ 等价于:

int temp = counter;
counter = counter + 1;
counter = temp;

postIncrement++ 运算符返回递增前的值; ++preIncrement 运算符返回递增的值。

【讨论】:

【参考方案3】:

替换

 counter = counter++;

作者: 1)

counter+=1;

2)

counter++;

干杯!

【讨论】:

【参考方案4】:

最好避免这种分配。 ++ 旨在单独使用。如果你想自己增加,你可以做counter += 1

【讨论】:

以上是关于为啥这会导致无限循环的主要内容,如果未能解决你的问题,请参考以下文章

为啥这会导致无限请求循环?

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

骑士之旅 - 导致无限循环,我不知道为啥

为啥在循环开始时调用 requestAnimationFrame 不会导致无限递归?

为啥这个 Scanf 会导致无限循环?

React 组件中的错误导致应用程序重新渲染,从而导致无限循环。为啥?