【发布时间】:2010-10-01 00:34:00
【问题描述】:
我很难理解以这种方式在 C# 中递增变量的区别是什么:
myInt++;
和
++myInt;
什么时候会在乎你使用哪一个?
我会给 voteCount++ 的最佳答案。还是我应该给它 ++voteCount...
【问题讨论】:
我很难理解以这种方式在 C# 中递增变量的区别是什么:
myInt++;
和
++myInt;
什么时候会在乎你使用哪一个?
我会给 voteCount++ 的最佳答案。还是我应该给它 ++voteCount...
【问题讨论】:
单独编写时没有区别(如图所示) - 在这两种情况下 myInt 都将递增 1。
但是在表达式中使用它时会有所不同,例如像这样:
MyFunction(++myInt);
MyFunction(myInt++);
在第一种情况下,myInt 递增,新的/递增的值被传递给 MyFunction()。在第二种情况下,将 myInt 的旧值传递给 MyFunction()(但 myInt 在调用函数之前仍会递增)。
另一个例子是这样的:
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
顺便说一句:正如Don 在评论中指出的,相同的规则也适用于减量操作,这些操作的正确术语是:
++i; // pre-increment
i++; // post-increment
--i; // pre-decrement
i--; // post-decrement
正如Jon Skeet 指出的那样:
其他人已经展示了它在哪里制作 差异,并评论为 一个单一的声明它不会做出 区别。
我想补充一点,差不多 在哪里使用它总是一个坏主意 有所作为。我怀疑那里 有时可能更多 可读的代码如下:
Console.WriteLine("Foo: {0}", foo++);比:
Console.WriteLine("Foo: {0}", foo); foo++;...但它们非常罕见!这 这两个样本中的后者使 立即订购晶莹剔透 - 前者需要一点思考 (无论如何,对我可怜的大脑来说)。考虑到 首先是可读性。
【讨论】:
其他人已经展示了它在哪里有所作为,并评论说作为一个单一的陈述它没有任何区别。
我想补充一点,在有影响的地方使用它几乎总是一个坏主意。我怀疑可能在某些时候使用以下代码更具可读性:
Console.WriteLine("Foo: {0}", foo++);
比:
Console.WriteLine("Foo: {0}", foo);
foo++;
...但它们非常罕见!这两个样本中的后者立即使订购变得清晰 - 前者需要一些思考(无论如何,对于我可怜的大脑)。首先考虑可读性。
【讨论】:
除非它在表达式中,否则不会,即
myInt=1;
x=myInt++;
不同于:
myInt=1;
x=++myInt;
第一个将 1 分配给 x,因为分配发生在增量之前。
第二个将 2 分配给 x,因为分配发生在增量之后。
【讨论】:
在赋值或表达式中,例如
x = ++myInt; // x = myInt + 1
x = myInt++; // x = myInt
这也可以用在 for 循环或 if 语句等表达式中。例如,在 seek 为 0 且 count 为 3 的情况下进行以下操作。
while(seek++ < count) {
Console.WriteLine(seek);
}
输出 1、2 和 3,用于搜索,以及以下
while(++seek < count) {
Console.WriteLine(seek);
}
搜索结果为 1 和 2。所以 ++myInt 在计算其值之前递增 myInt,而 myInt++ 在计算后递增。
【讨论】:
myInt++(4 个 CPU 指令)
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 指令)
LOAD AX, #myInt // From myInt memory to a CPU register
INCREMENT AX
STORE AX, #myInt
// Use AX register for the value
【讨论】:
如果你在做,那就不同了
int x = 7;
int x2 = x++;
=> x2 is 7 and x is 8
但是在做的时候
int x = 7;
int x2 = ++x;
=> x2 is 8 and x is 8
【讨论】:
前缀运算符 ++myInt 是一种减少行数的方法:在将变量传递到其他地方之前递增变量。这也是降低可读性的好方法,因为它不常见。
MyMethod(++myInt);
对比
myInt++;
MyMethod(myInt);
对我来说,第二个更容易阅读。
【讨论】:
它决定何时返回该操作的结果。
这是来自MSDN site 的示例:
static void Main()
{
double x;
x = 1.5;
Console.WriteLine(++x);
x = 1.5;
Console.WriteLine(x++);
Console.WriteLine(x);
}
然后输出:
2.5
1.5
2.5
【讨论】:
我认为按照评估和修改的顺序来理解是最简单的。
(操作顺序在运算符和变量的键入顺序中很明显)
即当在表达式中使用时,后缀运算符在应用运算符之前计算并使用表达式中变量的当前值(返回语句或方法调用)。使用前缀运算符则相反。
【讨论】:
++myInt 会在执行相关行之前给 myInt 添加一个,myInt++ 会在之后执行。
例子:
int myInt;
myInt = 1;
someFunction(++myInt); // Sends 2 as the parameter
myInt = 1;
someFunction(myInt++); // Sends 1 as the parameter
【讨论】:
如果你做这样的事情:
int myInt = 5;
Foo(++myInt);
void Foo(int x)
{
Console.WriteLine(x);
}
这将打印出 6。
Foo(myInt++);
将打印出 5;
基本上,++myInt 递增 FIRST 使用变量 SECOND。 myInt++ 正好相反。
【讨论】: