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

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的值,然后增加它。

I += i++表示: 取i的当前值。 添加i++的结果。

现在,让我们加入i = 0作为起始条件。 I += i++现在是这样计算的:

i的当前值是多少?它是0。存储它,这样我们就可以将i++的结果添加到它。 Evaluate i++(求值为0,因为这是i的当前值) 加载存储值并将第2步的结果添加到其中。(0加0)

注意:在第2步结束时,i的值实际上是1。但是,在第3步中,通过在i的值增加之前加载它来丢弃它。

与i++不同,++i返回的是增加后的值。

因此,i+= ++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+=i;

那么结果是2。

For

else if
i+=0;
i++;

结果是1。

关于这一点,我一直记得一个很好的助记法:

如果++位于表达式之后,则返回之前的值。下面的代码

int a = 1;
int b = a++;

是1,因为a在被a后面的++加起来之前是1,人们称之为后缀符号。还有一种前缀表示法,情况正好相反:如果++位于前面,表达式将返回操作之后的值:

int a = 1;
int b = ++a;

这里B是2。

对于你的代码,这意味着

int i = 0;
i += (i++);

i++返回0(如上所述),因此0 + 0 = 0。

i += (++i); // Here 'i' would become two

Scott Meyers在“有效的c++编程”中描述了这两种符号之间的区别。在内部,i++ (postfix)记住i的值,并调用前缀符号(++i)并返回旧值i。这就是为什么你应该总是在for循环中使用++i(尽管我认为所有现代编译器都在for循环中将i++转换为++i)。

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

I += ++ I;之前会做

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