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

时间:2017-05-09 20:03:48

标签: java for-loop increment

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

int num = 0;

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

System.out.println(num);

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

2 个答案:

答案 0 :(得分:8)

num++增加num after指令(它是一个后增量运算符) 因此num += num++;0分配给num(num = 0 + 0 + 0)。

在说明num += num++;后,num(即num++)的帖子增量无效,因为num被分配给另一个值(即num += 0结果是0)。
因此num的价值为0。 等等每次迭代。

num += num++替换为预增量运算符++num,您将得到结果:3(通过迭代递增1)。

答案 1 :(得分:6)

此作业

 num += num++;

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

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

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

根据&#34; 15.7.1。首先评估左手操作数&#34;在Java Language Specification中,Java首先决定分配的内容,以及它的值是什么。然后计算+=的右侧。

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

temp1 = num // and will assign to num
temp2 = num // before ++
num = num + 1
num = temp1 + temp2

如您所见,最后一行将num的原始值(恰好是0)添加到++之前的num值,这可确保{{ 1}}不会改变。它从num开始,以0结尾。

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

0

现在情况略有不同。

 num += ++num;

int temp1 = num // and num will be assigned int temp2 = num = num + 1 num = temp1 + temp2 中使用的num的值不是num += xxx的结果 - 它是我们执行++num之前的值。

首先,我们有++num,第二次迭代0+=1,第三次迭代1+=2 - 3+=4