21

我正在做一些关于 Java 的研究,发现这很令人困惑:

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

这是永无止境的循环!

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

4

5 回答 5

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

上面的循环本质上是相同的: -

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

您陈述的第三部分- ,被评估为: -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 的分配,A所以R不执行第 3 步。

现在,进行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++,我们需要执行我们在评估Aand时留下的最后一个赋值B,因为现在是在 中赋值的值x。为此,我们需要替换: -

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++: -

想知道为什么替换是 asA --> old1而不是x --> old1,如x = x++.

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

x = oldValue;

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

A = oldValue;
x = A;

现在,对于当前的问题,它与以下内容相同:-

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

我希望这能说清楚。

于 2013-01-28T21:12:15.743 回答
8

您正在使用 post-increment: i = i++;,它的意思是这样的:

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

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

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

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

正确的 for 循环:

for (int i = 0; i < 10; i++) {
  System.err.print("hoo... ");
}
于 2013-01-28T21:12:06.317 回答
4

因为 i=i++

for (int i = 0; i < 10;  i++) {
  System.err.print("hoo... ");
}
于 2013-01-28T21:12:19.367 回答
4

i++ 将报告 i 的值,然后递增。这也意味着您不需要将 i 设置为等于 i++,只需更改为

for (int i = 0; i < 10; i++) {
于 2013-01-28T21:12:48.530 回答
0

问题出在语句中i=i++,这个语句依次做了三个操作来完成。这是两个操作i++和一个 assignment( =) 操作。这些都是;

i++在任何操作之前进行两次操作

  1. 退货i

  2. 增量i

最后赋值操作

  1. 分配返回值

所以i在赋值之前递增,使其具有旧值。

让我们看看i=i++第一个循环( where i = 0)的三个操作

  1. 返回,直到下一个操作完成才0分配给i
  2. 递增i( i= 0 + 1 = 1)
  3. 将返回值赋给0, i( i = 0),最终i获得其旧值。

i++首先返回,但在i任何操作完成之前它会立即递增(i变为i+1),但是我们还需要完成赋值操作,以便将返回的值赋值为i使其具有旧值,从而进入无限循环。

所以替换i=i++i++i=i+1

于 2018-08-21T18:57:25.410 回答