我有一些代码
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10; i++)
j = j++;
Console.WriteLine(j);
}
为什么答案是 0 ?
我有一些代码
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10; i++)
j = j++;
Console.WriteLine(j);
}
为什么答案是 0 ?
这是因为++ 增量的工作方式。操作顺序在这篇 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
由于它是一个值对象,因此此时的两个对象 (j
和intermediateValue
) 是不同的。旧的 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;
顾名思义,后增量在使用该值后递增
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 递增和递减运算符