为什么循环在末尾打印0?

All*_*ang 2 java for-loop increment

这是我在网站上找到的一个例子.结果与我的预期完全不同.但没有进一步的解释.

int num = 0;

for (int i = 0; i < 3; ++i)
{  
    num += num++;
}

System.out.println(num);
Run Code Online (Sandbox Code Playgroud)

最后,结果将打印出来0.我对这个操作感到很困惑num += num++.有人可以解释一下吗?

dav*_*xxx 8

num++递增num after指令(它是一个后递增运算符).
所以num += num++;分配0num(num = 0 + 0 + 0).

在指令之后num += num++;,num(即num++)的后增量对于num分配给另一个值(num += 0结果是0)没有影响.
所以num很有价值0.等等每次迭代.

更换num += num++++num那就是预先递增运算符,你将得到的结果:3(当你通过迭代递增1).


小智 6

这个任务

 num += num++;
Run Code Online (Sandbox Code Playgroud)

在java中调用两个不同的规则:一个在左侧,一个在右侧.

右侧规则是众所周知的:后增量运算符的值是增量前变量的值.这使得值0++为零.

另一条规则有点模糊(我不知道左侧规则).

根据Java语言规范 Java中的"15.7.1.首先评估左手操作数",Java首先决定分配什么,以及它的价值.然后+=计算右侧.

考虑到这两个规则,上面的赋值相当于:

temp1 = num // and will assign to num
temp2 = num // before ++
num = num + 1
num = temp1 + temp2
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,最后一行将原始值num(恰好是0)添加到num++之前的值,这确保了num不会改变.它始于0,它结束0.

假设您现在使用的是预增量运算符:

 num += ++num;
Run Code Online (Sandbox Code Playgroud)

现在情况略有不同.

int temp1 = num // and num will be assigned
int temp2 = num = num + 1
num = temp1 + temp2
Run Code Online (Sandbox Code Playgroud)

numused in 的值num += xxx不是++num- 它是我们之前++num执行的值.

所以我们有第一次迭代0+=1,第二次迭代1+=2,第三次迭代3+=4- 那就是7