所以我是 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的事实所覆盖。j0
有时我发现查看字节码很有帮助。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。这个结果被存储回jby 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++);