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

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再次执行你分配的返回0(0)值的自增操作,这将覆盖增加的1(1),所以你得到0。您可以在++ operator (MSDN)中阅读更多关于自增操作符的信息。

其他回答

答案是i是1。

让我们来看看是如何做到的:

起初我= 0;。

然后在计算i+ =i++;根据的值,我们会得到类似0+=0 ++;,所以根据运算符优先级,0+=0将首先执行,结果将是0。

然后增量操作符将应用为0++,即0+1,i的值将为1。

int i = 0;
i += i++;

计算如下:

Stack<int> stack = new Stack<int>();
int i;

// int i = 0;
stack.Push(0);                   // push 0
i = stack.Pop();                 // pop 0 --> i == 0

// i += i++;
stack.Push(i);                   // push 0
stack.Push(i);                   // push 0
stack.Push(i);                   // push 0
stack.Push(1);                   // push 1
i = stack.Pop() + stack.Pop();   // pop 0 and 1 --> i == 1
i = stack.Pop() + stack.Pop();   // pop 0 and 0 --> i == 0

也就是说,I被改变了两次:一次是i++表达式,一次是+=语句。

但是+=语句的操作数是

在i++求值之前的值I(+=的左边)和 i++求值前的值I(+=的右边)。

首先,i++返回0。然后i加1。最后,i被设置为i的初始值,即0加上i++返回的值,也为0。0 + 0 = 0。

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

I += ++ I;之前会做

有两种选择:

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

i++;
i+=i;

那么结果是2。

For

else if
i+=0;
i++;

结果是1。