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

时间:2013-01-28 21:11:13

标签: java loops for-loop infinite-loop post-increment

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

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

这是永无止境的循环!

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

5 个答案:

答案 0 :(得分:39)

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

上述循环基本上与: -

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

for语句的{ rd 部分 - i = 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.

现在,由于此处未完成AR的分配,因此未执行第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++的值,我们需要执行我们在评估AB时留下的最后一项分配,因为现在是分配的值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

分解x = x++的第3部分,看看它在x = x++ + x++案例中是如何运作的: -

想知道为什么替换是以A --> old1而非x --> old1完成的,就像x = x++一样。

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

x = oldValue;

如果您在此处考虑x++A,则上述分配可分为以下步骤: -

A = oldValue;
x = A;

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

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

我希望说清楚。

答案 1 :(得分:8)

你正在使用后增量:i = i++;,它意味着这样:

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

因为15.14.2 Postfix Increment Operator ++

  

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

这就是你有旧价值的原因。

完成For-loop:

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

答案 2 :(得分:4)

因为i = i ++

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:0)

问题出在语句i=i++中,该语句按顺序执行三个操作。这是i++中的两个操作和一个Assignment(=)操作。这些是

i++先执行两次操作

  1. 返回i

  2. 增加i

最终分配操作

  1. 分配返回值

因此i在赋值之前递增,使其具有旧值。

让我们在第一个循环(其中i=i++)中通过三个操作查看i = 0

  1. 返回0,直到完成下一个操作,它才会分配给i
  2. 增加ii= 0 + 1 = 1
  3. 将返回值0分配给i((i = 0),最后i具有旧值。

i++中,首先返回i,但是在执行任何操作之前,它立即递增(i变成i+1),但是我们还剩下赋值操作完成,以便将返回值分配给i,使其具有旧值,从而进入无限循环。

因此将i=i++替换为i++i=i+1