下面的代码(可用作控制台应用程序):

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。很明显,事实并非如此。

你能解释编译器做什么或者在运行时发生了什么吗?为什么结果是零?

某种免责声明:我非常清楚您不会(而且可能不应该)使用此代码。我知道我永远不会。尽管如此,我觉得了解它为什么会以这样的方式工作以及究竟发生了什么是很有趣的。


当前回答

因为i++首先返回值,然后对其递增。但是当i被设为1后,你把它设回0。

其他回答

有两种选择:

第一个选项:如果编译器按如下方式读取语句,

i++;
i+=i;

那么结果是2。

For

else if
i+=0;
i++;

结果是1。

i=0

i+=i

i=i+1

i=0;

然后把1加到i上。

i+=i++

在给i加1之前,i取了0。只有在前面加1,我才得到0。

i+=++i

i=2

I += I ++;Will等于0,因为它在后面执行++。

I += ++ I;之前会做

变量后面的++操作符使其成为后加式。增量操作发生在语句中的其他所有操作之后,包括加法和赋值操作。相反,如果你把++放在变量之前,它会在i的值被计算之前发生,并给你预期的答案。

后增量方法看起来像这样

int ++(ref int i)
{
    int c = i;
    i = i + 1;
    return c;
}

所以基本上当你调用i++时,i是增量,但在你的例子中,它返回的是0。