所以我是 Java 编程新手,我很难理解为什么会这样
for (int i = 0, j=0; i <10; i++) {
System.out.println(j += j++);
}
十次打印出0?
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
by ISTORE
after j
has been incremented by IINC
。
在j += j++
你实际上在做
j = j + j++;
所以j=0
你会得到
j = 0 + j++
并且因为在返回它的值后j++
会增加j
你会得到
j = 0 + 0;
现在j++
j 之后将等于 1,但是在计算0+0
之后它将返回0
并打印该值。
你不确定for循环吗?int i = 0 声明了一个 int i,并将其设置为 0。j = 0 还声明了另一个 int j,并将其设置为 0。i < 10 表示当 i 小于 10 时,循环将继续进行。最后,i++ 声明每次循环完成时,i = i + 1,所以本质上 i 会加一。
System.out.println(++j);
代替
System.out.println(j += j++);