不确定for循环迭代?

arc*_*421 2 java for-loop

所以我刚开始用Java编程,我只是很难理解为什么会这样

for (int i = 0, j=0; i <10; i++) {
    System.out.println(j += j++);
}
Run Code Online (Sandbox Code Playgroud)

打印出10次?

ars*_*jii 5

j += j++
Run Code Online (Sandbox Code Playgroud)

可以被认为是

j = j + j++
Run Code Online (Sandbox Code Playgroud)

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

   j = 0 + 0
//     ^   ^
//     j   j++
Run Code Online (Sandbox Code Playgroud)

十次.由于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
Run Code Online (Sandbox Code Playgroud)

由于IINC不会以任何方式改变堆栈,因此IADD将值添加j到自身:0 + 0.这一结果被存储回jISTORE 后, j已被递增IINC.