C#前后增量混淆

我对C#编译器如何处理前后增量和递减有点困惑。

当我编码如下:

int x = 4; x = x++ + ++x; 

x之后会有10的值。 我认为这是因为预增量将x设置为5 ,这使得5+5评估为10 。 然后后增加将更新x6 ,但是这个值将不会被使用,因为那么10将被分配给x

但是当我编码:

 int x = 4; x = x-- - --x; 

那么x会在2之后。 任何人都可以解释为什么是这样的情况?

x--将会是4,但在--x的时候会是3,所以它会结束为2,那么你就会拥有

 x = 4 - 2 

顺便说一句,你的第一个例子是x = 4 + 6

下面是一个小例子,它将打印每个部分的值,也许这样你会更好地理解它:

 static void Main(string[] args) { int x = 4; Console.WriteLine("x++: {0}", x++); //after this statement x = 5 Console.WriteLine("++x: {0}", ++x); int y = 4; Console.WriteLine("y--: {0}", y--); //after this statement y = 3 Console.WriteLine("--y: {0}", --y); Console.ReadKey(); } 

这打印出来

 x++: 4 ++x: 6 y--: 4 --y: 2 

让我们看看从这个语句中得到的IL

 IL_0002: ldloc.0 

将x的值加载到堆栈上。 堆栈=>(4)

 IL_0003: dup 

复制堆栈中最顶端的项目。 堆栈=>(4,4)

 IL_0004: ldc.i4.1 

将1推入堆栈。 堆栈=>(1,4,4)

 IL_0005: sub 

减去两个最高值并将结果推送到堆栈上。 堆栈=>(3,4)

 IL_0006: stloc.0 

将堆栈的最高值存回x。 堆栈=>(4)

 IL_0007: ldloc.0 

将x的值加载回栈中。 堆栈=>(3,4)

 IL_0008: ldc.i4.1 

将值1加载到堆栈上。 堆栈=>(1,3,4)

 IL_0009: sub 

减去两个。 堆栈=>(2,4)

 IL_000A: dup 

复制最高值=>(2,2,4)

 IL_000B: stloc.0 

将最高值存储回x。 堆栈=>(2,4)

 IL_000C: sub 

减去两个最高值。 堆栈=>(2)

 IL_000D: stloc.0 

将该值存回x。 x == 2

从你的评论:

我认为post-pre-increment是在评估完整的codeline之后/之前执行的,但是它们是在评估expression式中的每个项目之后/之前执行的。

你的误解是非常普遍的。 请注意,在某些语言(如C)中,当副作用变得可见时,不会指定它,因此您的语句在C中是正确的,因此它是合法的,但不是必需的。

这不是在C#中的情况; 在expression式左边的代码的 C# 副作用总是被观察到发生在右边的代码执行之前 (从一个线程;在multithreading场景中所有的赌注都closures)。

有关增量运算符在C#中所做的更详细的解释,请参阅:

i ++和++ i有什么区别?

在这篇经常被误解的话题上,我写了很多文章。

最有意思的是,你将得到与C ++ .Net编译器完全不同的答案。

 int x = 4; x = x++ + ++x; // x = 11 x = 4; x = x-- - --x; // x = -1 

当然,结果的差异是由不同的语义决定的 – 这似乎是正常的。 但是,尽pipe理解了两个.net编译器不会以类似的方式performance这样的基本事物,也使我感到困惑。

在这个例子中,

 int x = 4; x = x++ + ++x; 

你可以打破它像:

 x = 4++; which is = 5 x = 4 + ++5; which is 4 + 6 x = 10 

同样的,

 int x = 4; x = x-- - --x; 

这里,

 x = 4--; which is = 3 x = 4 - --3; which is 4 - 2 x = 2 

简单地说,可以说,取代当前的x值,但每个++或 – 从x中增加/减去一个值。

我认为对++ ++ ++的解释是错误的:

命令……….. x的值

………………未定义

int x = 4 ………. 4

x ++ …………… 5(第一个加数是4)

++ x …………… 6(第二个加数是6)

x = summand1 + summand2.4 + 6 = 10

类似于案例的解释是

命令……….. x的值

………………未定义

int x = 4 ………. 4

x – 。。。。。(3)

–x …………… 2(减数为2)

x =减法 – 减数.4-2 = 10