后增量运算符未在 for 循环中递增

我正在对Java进行一些研究,发现这非常令人困惑:

for (int i = 0; i < 10; i = i++) {
  System.err.print("hoo... ");
}

这是永无止境的循环!

任何人都有很好的解释为什么会发生这样的事情?


答案 1
for (int i = 0; i < 10; i = i++) {

上面的循环基本上与: -

for (int i = 0; i < 10; i = i) {

语句的第 3 部分 - ,计算结果为: -fori = i++

int oldValue = i; 
i = i + 1;
i = oldValue;  // 3rd Step 

您需要从那里删除分配,以使其正常工作:-

for (int i = 0; i < 10; i++) {

(根据OP请求的评论)

行为 : -x = 1; x = x++ + x++;

就您在评论中指定的问题而言,以下表达式的结果: -

x = 1; 
x = x++ + x++;

获得如下: -

让我们标记第二个语句的不同部分:-

x = x++ + x++;
R    A     B

现在,首先将评估 RHS 部件,然后将最终结果分配给 。因此,让我们继续前进。(A + B)x

首先进行评估:-A

old1 = x;  // `old1 becomes 1`
x = x + 1; // Increment `x`. `x becomes 2`
//x = old1; // This will not be done. As the value has not been assigned back yet.

现在,由于此处未完成 to 的分配,因此不执行第 3 步。AR

现在,转到评估:-B

old2 = x;  // old2 becomes 2. (Since `x` is 2, from the evaluation of `A`)
x = x + 1; // increment `x`. `x becomes 3`.
// x = old2; // This will again not be done here.

现在,要获得 的值,我们需要执行在 和 的评估中留下的最后一个赋值,因为现在是 在 中分配的值。为此,我们需要替换: -x++ + x++ABx

A --> old1
B --> old2   // The last assignment of both the evaluation. (A and B)

/** See Break up `x = old1;` towards the end, to understand how it's equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/

因此,,成为: -x = x++ + x++

x = old1 + old2;
  = 1 + 2;
  = 3;  // Hence the answer

分解的第 3 部分,看看它是如何工作的,以防万一: -x = x++x = x++ + x++

想知道为什么替换是作为 而不是 完成的,如 的情况。A --> old1x --> old1x = x++

深入了解部分,特别是最后一个任务: -x = x++

x = oldValue;

如果您考虑在这里,那么上述分配可以分解为以下步骤: -x++A

A = oldValue;
x = A;

现在,对于当前的问题,它与: -

A = old1;
B = old2;
x = A + B;

我希望这能说明问题。


答案 2

您正在使用后增量:,它的意思是这样的:i = i++;

temp = i;
i = i + 1;
i = temp;

因为 15.14.2 后缀增量运算符 ++

后缀增量表达式的值是存储新值之前的变量值。

这就是为什么你有旧的价值。

对循环正确完成:

for (int i = 0; i < 10; i++) {
  System.err.print("hoo... ");
}

推荐