C# 有人能解释一下++;操作人员

C# 有人能解释一下++;操作人员,c#,operators,C#,Operators,可能重复: 我经常看到这个操作符(++)。我知道它最终会做什么,但似乎有些规则我不明白。例如,将它放在正在使用它的变量之前还是之后似乎很重要。有人能解释一下吗?这句话 x++; 完全等同于 x = x + 1; 除了x只计算一次(如果它是一个包含属性getter的表达式,则会产生差异) 以下两者之间的区别: DoSomething(x++); // notice x first, then ++ DoSomething(++x); // notice ++ first, then

可能重复:

我经常看到这个操作符(++)。我知道它最终会做什么,但似乎有些规则我不明白。例如,将它放在正在使用它的变量之前还是之后似乎很重要。有人能解释一下吗?

这句话

x++;
完全等同于

x = x + 1;
除了
x
只计算一次(如果它是一个包含属性getter的表达式,则会产生差异)

以下两者之间的区别:

DoSomething(x++);   // notice x first, then ++
DoSomething(++x);   // notice ++ first, then x
在第一种方法中,
DoSomething
方法将看到在递增之前的
x
值。在第二个中,它将看到新的(递增的)值

有关更多信息,请参阅MSDN上的

可以为您自己的类声明一个自定义的
++
运算符,在这种情况下,该运算符可以执行不同的操作。如果要定义自己的
++
运算符,请参见MSDN上的。

递增运算符(++)将其操作数递增1。递增运算符可以出现在其操作数之前或之后:

第一种形式是前缀递增操作。运算的结果是操作数递增后的值


第二种形式是后缀增量操作。运算的结果是操作数递增之前的值。

如果你这样说的话

variable++
它首先使用变量及其增量(+1) 另一方面,如果你

++variable

它首先递增变量,然后使用它

如果将++运算符放在变量之前,则首先递增。如果将++运算符放在变量之后,则它将在变量之后递增

例如(C#):

int x=0; WriteLine(“x是{0}”,x++);//x是0

int y=0;
WriteLine(“y是{0}”,++y);//如果将
++
运算符放在变量之前,则y为1,它首先递增。 如果将
++
运算符放在变量后面,则它在后面递增

例如(C#):


希望这件事能澄清。

另一种看待它的方式。。。这里有两个与prefix/postfix++相同的函数。这说明前缀在理论上更快,因为不需要临时变量来存储“previous”值:


不,
i=i++
表示先递增,然后再重新分配旧值,使操作无效
i=++i
与简单的
++i
具有相同的效果。是的,我正要写同样的东西。i=i++和类似的例子对于解释来说是非常糟糕的,因为它更容易混淆解释。你不应该像那样复制粘贴其他人的答案。“除了
x
只计算一次”-对不起,你错了
x++
x=x+1
实际上是完全等效的。注意,在后一种情况下,
x
也只计算一次。然后设置它,这在x++中也会发生。(当然,我的评论是指将运算符用作语句,而不是另一个调用的一部分,在这种情况下,
function(x++)
function(x=x+1)
,显然,它们的行为不一样)@Michael:你误解了我的意思。如果编写
myObj.SomeProperty.SomeValue++
,则只调用一次
SomeProperty
getter,但如果编写
myObj.SomeProperty.SomeValue=myObj.SomeProperty.SomeValue+1
,则调用两次。在本例中,您是对的,SomeProperty getter被调用了两次:-)只是想指出SomeValue getter只被调用一次。我想,编译器可能会优化掉双getter调用?但这只是一种怀疑。@Michael:任何优化它的编译器都会有一个bug。C#规范对预期的副作用非常明确。这不是C++:毕竟,x++和x= x+1完全相同。不相信我?试试看。字节x=0;x++;vs字节x=0;x=x+1;给出不同的结果,因为其中一个甚至没有编译。虽然这是这个问题的常见答案,但实际上是错误的。增量发生的时间不会因运算符是前缀还是后缀而改变。所做的更改是选择增量期间计算的临时值作为运算符的结果。将这个答案与Michael的答案进行对比,这个答案指出差异在于副作用发生的时间,这个答案正确地指出差异在于返回的值。这是一个微妙但重要的区别。@Eric-我不知道:)。谢谢你的解释!这个答案也不正确。最后一条语句错误地暗示结果是递增后的变量值,而实际上结果是分配给变量的值。变量没有被再次读取。@Eric Lippert你对细节很在行,我不知道。
int x = 0;
Console.WriteLine("x is {0}", x++); // Prints x is 0

int y = 0;
Console.WriteLine("y is {0}", ++y); // Prints y is 1
// same as x ++;
int PostfixIncrement(ref int x)
{
    int y = x;
    x = x + 1;
    return y;
}

// same as ++ x;
int PrefixIncrement(ref int x)
{
    x = x + 1;
    return x;
}