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;
}