In C# what is the difference between myInt++ and ++myInt?
我很难理解用C这种方式增加变量的区别是什么:
1 | myInt++; |
和
1 | ++myInt; |
你什么时候用哪个才重要?
我会给votecount++最好的答案。或者我应该给它+votecount…
单独编写时没有区别(如图所示)-在这两种情况下,myint都将增加1。
但是在表达式中使用它时有一个区别,例如如下所示:
1 2 | MyFunction(++myInt); MyFunction(myInt++); |
在第一种情况下,myint递增,新的/递增的值传递给myfunction()。在第二种情况下,myint的旧值被传递给myfunction()(但myint在调用函数之前仍然递增)。
另一个例子是:
1 2 3 4 5 6 7 | int myInt = 1; int a = ++myInt; // myInt is incremented by one and then assigned to a. // Both myInt and a are now 2. int b = myInt++; // myInt is assigned to b and then incremented by one. // b is now 2, myInt is now 3 |
顺便说一句:正如唐在评论中指出的,相同的规则也适用于递减操作,这些操作的正确术语是:
1 2 3 4 | ++i; // pre-increment i++; // post-increment --i; // pre-decrement i--; // post-decrement |
乔恩·斯基特指出:
Others have shown where it makes a
difference, and have commented that as
a single statement it doesn't make a
difference.I'd like to add that it's almost
always a bad idea to use it where it
makes a difference. I suspect there
may be some times where it's more
readable to have code such as:
1 Console.WriteLine("Foo: {0}", foo++);than:
1
2 Console.WriteLine("Foo: {0}", foo);
foo++;... but they're very rare! The
latter of these two samples makes the
ordering crystal clear immediately -
the former requires a bit of thinking
(to my poor brain, anyway). Think of
the readability first.
其他人已经表明了它在哪里产生了影响,并评论说,作为一个单一的陈述,它不会产生影响。
我想补充一点,在有影响的地方使用它几乎总是一个坏主意。我怀疑在某些情况下,代码更易于阅读,例如:
1 | Console.WriteLine("Foo: {0}", foo++); |
比:
1 2 | Console.WriteLine("Foo: {0}", foo); foo++; |
…但它们非常罕见!这两个样本中的后一个立即使排序清晰明了——前一个需要一些思考(对我可怜的大脑来说,无论如何)。首先考虑可读性。
除非它是在一个表达中,也就是说。
1 2 | myInt=1; x=myInt++; |
不同于:
1 2 | myInt=1; x=++myInt; |
第一个赋值1到x,因为赋值发生在增量之前。
第二个分配2到x,因为分配发生在增量之后。
例如,在赋值或表达式中
1 2 | x = ++myInt; // x = myInt + 1 x = myInt++; // x = myInt |
这也可以在表达式中使用,比如for循环或if语句。例如,下面的seek为0,count为3。
1 2 3 | while(seek++ < count) { Console.WriteLine(seek); } |
结果输出1、2和3,用于搜索,以及以下内容
1 2 3 | while(++seek < count) { Console.WriteLine(seek); } |
搜索结果为1和2。因此,++myint在计算其值之前递增myint,而myint++在计算之后递增。
myint++(4个CPU指令)
1 2 3 4 5 | LOAD AX, #myInt // From myInt memory to a CPU register COPY AX, BX INCREMENT BX STORE BX, #myInt // Use AX register for the value |
++myint(3个CPU指令)
1 2 3 4 | LOAD AX, #myInt // From myInt memory to a CPU register INCREMENT AX STORE AX, #myInt // Use AX register for the value |
我认为从评估和修改的顺序来理解它是最简单的。
- 后缀运算符(x++)先计算后修改。
- 前缀运算符(++X)修改先评估后评估。
(操作顺序在运算符和变量的类型顺序中很明显)
也就是说,当在表达式中使用时,postfix运算符在应用运算符之前计算并使用表达式中变量的当前值(返回语句或方法调用)。而前缀操作符则相反。
pre-fix操作符+myint是一种减少行数的方法:在将变量传递到其他地方之前增加变量。这也是一种降低可读性的好方法,因为它不常见。
1 | MyMethod(++myInt); |
VS
1 2 | myInt++; MyMethod(myInt); |
对我来说,第二个更容易阅读。
它确定何时返回该操作的结果。
以下是来自msdn站点的示例:
1 2 3 4 5 6 7 8 9 | static void Main() { double x; x = 1.5; Console.WriteLine(++x); x = 1.5; Console.WriteLine(x++); Console.WriteLine(x); } |
和输出:
1 2 3 | 2.5 1.5 2.5 |
如果你在做,那就不同了
但当做
++myint将在执行相关行之前向myint添加一个,myint++随后将执行该操作。
实例:
1 2 3 4 5 6 7 | int myInt; myInt = 1; someFunction(++myInt); // Sends 2 as the parameter myInt = 1; someFunction(myInt++); // Sends 1 as the parameter |
例如,如果您执行如下操作:
1 2 3 4 5 6 7 8 | int myInt = 5; Foo(++myInt); void Foo(int x) { Console.WriteLine(x); } |
这将打印出6。
1 | Foo(myInt++); |
将打印出5个;
基本上,++myint递增首先使用变量second。myint++正好相反。