关于语法:在C#中,myint++和+myint有什么区别?

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

如果你在做,那就不同了

1
2
3
4
int x = 7;
int x2 = x++;

=> x2 is 7 and x is 8

但当做

1
2
3
4
int x = 7;
int x2 = ++x;

=> x2 is 8 and x is 8

++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++正好相反。