我有点困惑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
。 有人能解释一下这是为什么吗?
我有点困惑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
将两者相减。Stack => (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
根据您的评论:
我认为后置和前置自增在完整代码行的评估之后/之前执行,但它们在表达式中每个项目的评估之后/之前执行。
您的误解是非常普遍的。请注意,在某些语言(如C)中,副作用何时变得可见并没有指定,因此在C中您的语句合法但不是必须的。
但在C#中情况并非如此;在C#中,左侧代码的副作用总是在右侧代码执行之前发生(在单线程中;在多线程场景中则无法保证)。
有关C#中增量运算符的详细说明,请参见:
那里还有许多其他链接,这些链接指向我撰写的有关这个经常被误解的主题的文章。
int x = 4;
x = x++ + ++x; // x = 11
x = 4;
x = x-- - --x; // x = -1
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(减数为4)
--x...............2(被减数为2)
x=subtractor-subtrahend ..4-2=10