解释C#中的后增量

时间:2012-03-25 20:26:14

标签: c# post-increment

  

可能重复:
  Behaviour and Order of evaluation in C#

我有一些代码

static void Main(string[] args)
{
    int j = 0;
    for (int i = 0; i < 10; i++) 
        j = j++;
    Console.WriteLine(j);
}

为什么答案是0?

2 个答案:

答案 0 :(得分:7)

这是因为++ increment works的方式。 The order of operations is explained in this MSDN article这可以在这里看到(如果我正在阅读关于这个错误的规范,请有人纠正我:)):

int j = 2;
//Since these are value objects, these are two totally different objects now
int intermediateValue = j;
j = 2 + 1
//j is 3 at this point
j = intermediateValue;
//However j = 2 in the end

由于它是一个值对象,因此该点上的两个对象(jintermediateValue)是不同的。旧的j增加了,但因为你使用了相同的变量名,所以你输了。我建议你阅读value objects versus reference objects的差异。

如果您为变量使用了单独的名称,那么您将能够更好地看到此细分。

int j = 0;
int y = j++;
Console.WriteLine(j);
Console.WriteLine(y);
//Output is 
// 1
// 0

如果这是一个具有类似运算符的引用对象,那么这很可能会按预期工作。特别指出如何只创建指向同一引用的新指针。

public class ReferenceTest
{
    public int j;
}

ReferenceTest test = new ReferenceTest();
test.j = 0;
ReferenceTest test2 = test;
//test2 and test both point to the same memory location
//thus everything within them is really one and the same
test2.j++;
Console.WriteLine(test.j);
//Output: 1

回到原点,但是:)

如果您执行以下操作,那么您将获得预期的结果。

j = ++j;

这是因为首先发生增量,然后是赋值。

但是,++可以单独使用。所以,我只想重写为

j++;

因为它只是翻译成

j = j + 1;

答案 1 :(得分:1)

如名称所示,使用该值后的增量后增量

y = x++;

根据C# Language Specification,这相当于

temp = x;
x = x + 1;
y = temp;

应用于您的原始问题,这意味着j在这些操作后保持不变。

temp = j;
j = j + 1;
j = temp;

你也可以使用预增量,这是相反的

x = x + 1;
y = x;

y = ++x;

请参阅MSDN上的Postfix increment and decrement operators