0

我有一些代码

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

为什么答案是 0 ?

4

2 回答 2

7

这是因为++ 增量的工作方式。操作顺序在这篇 MSDN 文章中进行了解释这可以在这里看到(如果我读错了这个规范,请有人纠正我 :)):

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 与 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;
于 2012-03-25T20:30:17.990 回答
1

顾名思义,后增量在使用该值后递增

y = x++;

根据C# 语言规范,这相当于

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

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

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

您也可以使用预增量,它的作用相反

x = x + 1;
y = x;

或者

y = ++x;

请参阅MSDN 上的Postfix 递增和递减运算符

于 2012-03-25T20:30:21.803 回答