我有一些代码
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10; i++)
j = j++;
Console.WriteLine(j);
}
为什么答案是0?
答案 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
由于它是一个值对象,因此该点上的两个对象(j
和intermediateValue
)是不同的。旧的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;