不确定for循环迭代?

时间:2013-09-12 01:30:36

标签: java for-loop

所以我刚接触Java编程,我只是很难理解为什么会这样做

for (int i = 0, j=0; i <10; i++) {
    System.out.println(j += j++);
}

打印出10次?

4 个答案:

答案 0 :(得分:5)

j += j++

可以被认为是

j = j + j++

现在,我们从j = 0开始,j++增加j返回其旧值0 (!),因此我们基本上留下了

   j = 0 + 0
//     ^   ^
//     j   j++
十次。 j的增量被我们重新分配j到右边的结果(0)的事实所覆盖。


有时我发现查看字节码很有帮助。 j += j++确实是:

ILOAD 1    // load j, which is 0
ILOAD 1    // load j, which is 0
IINC 1 1   // j++ 
IADD       // add top two stack elements
ISTORE 1   // store result back in j

由于IINC不会以任何方式改变堆栈,IADD会将j的值添加到自身:0 + 0。在 j增加ISTORE后,此结果将由j 存储回IINC

答案 1 :(得分:1)

j += j++你实际上在做

j = j + j++;

因此对j=0你会得到

j = 0 + j++

并且由于j++在返回其值后会增加j,您将获得

j = 0 + 0;

现在,j++ j后将等于1,但在计算0+0后,它将返回0,并且将打印该值。

答案 2 :(得分:0)

你不确定for循环吗? int i = 0声明一个int i,并将其设置为0. j = 0也声明另一个int j,并将其设置为0. i&lt; 10表示当我小于10时,循环将继续。最后,i ++声明每次完成循环时,i = i + 1,因此基本上会将一个循环添加到i。

答案 3 :(得分:-1)

System.out.println(++j);

而不是

System.out.println(j += j++);