【发布时间】:2012-11-11 02:05:22
【问题描述】:
获取以下代码(可用作控制台应用程序):
static void Main(string[] args)
{
int i = 0;
i += i++;
Console.WriteLine(i);
Console.ReadLine();
}
i 的结果为 0。我预计为 2(正如我的一些同事所做的那样)。可能编译器会创建某种结构,导致i 为零。
我期望 2 的原因是,在我的思路中,右手边的语句将首先被评估,将 i 加 1。然后将它添加到 i。由于 i 已经是 1,所以它正在将 1 加到 1。所以 1 + 1 = 2。显然这不是正在发生的事情。
你能解释一下编译器做了什么或者在运行时发生了什么吗?为什么结果为零?
某种免责声明:我绝对知道您不会(并且可能不应该)使用此代码。我知道我永远不会。不过,我发现了解它为何以这种方式运行以及究竟发生了什么是很有趣的。
【问题讨论】:
-
预期结果不应该是 1 吗? i(0) += i++(1) 因此 0 += 1 = 1
-
它按预期工作
-
这个问题将被问到多少种变体?
-
Preincrementation 会在执行动作之前增加值 i += ++i 会给你 1
-
为什么每个人都关注前增量和后增量? “奇怪”的事情是
+=左侧的i的 value 在评估右侧之前被“缓存”。这是违反直觉的,例如,如果i是一个对象,则需要进行复制操作。 (请不要误解我的意思:我绝对同意声明0是正确且符合标准的答案。)