这是我在网站上找到的一个例子。结果与我的预期完全不同。但没有进一步解释。
int num = 0;
for (int i = 0; i < 3; ++i)
{
num += num++;
}
System.out.println(num);
最后,结果将打印0
。我对操作num += num++
感到很困惑。有人可以解释一下吗?
答案 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