C#前后增量混淆
我对C#编译器如何处理前后增量和递减有点困惑。
当我编码如下:
int x = 4; x = x++ + ++x;
x
之后会有10的值。 我认为这是因为预增量将x
设置为5
,这使得5+5
评估为10
。 然后后增加将更新x
为6
,但是这个值将不会被使用,因为那么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