为什么这会导致无限循环?

5

考虑下面这段简单的代码:

 // 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不失败感到困惑。


你知道如何使用调试器吗?这是一个非常好的工具,可以帮助你理解代码的工作原理。 - Code-Apprentice
https://dev59.com/fW865IYBdhLWcg3wZdxW?rq=1 - fastcodejava
可能是Java中x++和++x有什么区别?的重复问题。 - nawfal
4个回答

17
counter = counter++;

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

The above code has no effect on counter. It is effectively same as:

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

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

另一方面,如果您使用:

counter = ++counter;

先递增计数器,再将其重新分配给计数器。基本上,您可以简单地忽略分配部分,保持它简单:

counter++; // Or ++counter

@Elliott,你可以通过阅读这里的后缀和前缀增量来进一步了解:http://en.wikipedia.org/wiki/Increment_and_decrement_operators - user1181445

2
问题在于循环体结束时counter的值与开始时相同。语句counter = counter++等价于:
int temp = counter;
counter = counter + 1;
counter = temp;
< p > postIncrement ++ 运算符返回递增前的值;++ preIncrement 运算符返回递增后的值。


1
替换

标签。

 counter = counter++;

由: 1)

counter+=1;

或者

2)

counter++;

干杯!


0
最好避免这种赋值方式。 ++是用来单独使用的,如果你想自增,可以使用counter += 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接