所以我刚开始用Java编程,我只是很难理解为什么会这样
for (int i = 0, j=0; i <10; i++) {
System.out.println(j += j++);
}
Run Code Online (Sandbox Code Playgroud)
打印出10次?
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.这一结果被存储回j用ISTORE 后, j已被递增IINC.