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

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

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

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


当前回答

简单的答案

int i = 0;
i += i++;
// Translates to:
i = i + 0; // because post increment returns the current value 0 of i
// Before the above operation is set, i will be incremented to 1
// Now i gets set after the increment,
// so the original returned value of i will be taken.
i = 0;

其他回答

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

后修正自增操作符++,在表达式中给变量一个值,然后对i再次执行你分配的返回0(0)值的自增操作,这将覆盖增加的1(1),所以你得到0。您可以在++ operator (MSDN)中阅读更多关于自增操作符的信息。

希望从C编程101的角度来回答这个问题。

在我看来,它是这样发生的:

I被求值为0,导致I = 0 + 0,使用递增操作i++ "queued",但将0赋值给I也没有发生。 发生增量i++ 上面的赋值i = 0发生了,有效地覆盖了#2(后增量)所做的任何事情。

现在,#2可能永远不会真正发生(可能不会?),因为编译器可能意识到它没有任何作用,但这可能取决于编译器。不管怎样,其他更有知识的回答已经表明结果是正确的,并且符合c#标准,但是这里没有定义C/ c++的情况。

如何和为什么超出了我的专业知识,但事实是,前面计算的右边赋值发生在后增量之后,这可能是令人困惑的地方。

此外,你不会期望结果是2,除非你用++i而不是i++,我相信。

计算步骤如下:

int i=0 //初始化为0 我+ + + = / /方程 I = I +i++ //通过编译器简化后的方程 I =0+i++ // I值替换 I =0+0 //i++是0,如下所述 i=0 //最终结果i=0

这里,i的初始值是0。 WKT, i++只是:首先使用i值,然后将i值增加1。所以 它在计算i++时使用I值0,然后将其加1。 所以结果是0。

要非常小心:阅读C常见问题:你试图做的事情(同一个变量的赋值和++混合)不仅没有指定,而且也是未定义的(这意味着编译器在求值时可能会做任何事情!),不仅给出“合理”的结果)。

请阅读第三部分。整个章节都很值得一读!特别是3.9,这解释了未指明的含义。3.3节简要介绍了使用“i++”之类的工具可以做什么,不能做什么。

根据编译器内部的不同,您可能会得到0、2、1,甚至其他任何值!因为它是没有定义的,所以他们这样做是可以的。