所以我刚接触Java编程,我只是很难理解为什么会这样做
for (int i = 0, j=0; i <10; i++) {
System.out.println(j += j++);
}
打印出10次?
答案 0 :(得分:5)
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
增加ISTORE
后,此结果将由j
存储回IINC
。
答案 1 :(得分:1)
在j += j++
你实际上在做
j = j + j++;
因此对j=0
你会得到
j = 0 + j++
并且由于j++
在返回其值后会增加j
,您将获得
j = 0 + 0;
现在,j++
j后将等于1,但在计算0+0
后,它将返回0
,并且将打印该值。
答案 2 :(得分:0)
你不确定for循环吗? int i = 0声明一个int i,并将其设置为0. j = 0也声明另一个int j,并将其设置为0. i&lt; 10表示当我小于10时,循环将继续。最后,i ++声明每次完成循环时,i = i + 1,因此基本上会将一个循环添加到i。
答案 3 :(得分:-1)
System.out.println(++j);
而不是
System.out.println(j += j++);