1

所以我是 Java 编程新手,我很难理解为什么会这样

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

十次打印出0?

4

4 回答 4

5
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

于 2013-09-12T01:33:41.123 回答
1

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

j = j + j++;

所以j=0你会得到

j = 0 + j++

并且因为在返回它的值后j++会增加j你会得到

j = 0 + 0;

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

于 2013-09-12T01:35:20.123 回答
0

你不确定for循环吗?int i = 0 声明了一个 int i,并将其设置为 0。j = 0 还声明了另一个 int j,并将其设置为 0。i < 10 表示当 i 小于 10 时,循环将继续进行。最后,i++ 声明每次循环完成时,i = i + 1,所以本质上 i 会加一。

于 2013-09-12T02:12:24.523 回答
-1
System.out.println(++j);

代替

System.out.println(j += j++); 
于 2013-09-12T01:34:42.520 回答