int x = 10; x + = x--; 在.Net - 为什么?

Tom*_*ter 33 .net c# operators

int x = 10;
x += x--;
Run Code Online (Sandbox Code Playgroud)

在C#/ .Net中,为什么它等于它等于的?(我故意把答案留下来,所以你可以猜测,看看你是否正确)

Jon*_*eet 53

看看这句话:

x += x--;
Run Code Online (Sandbox Code Playgroud)

这相当于:

x = x + x--;
Run Code Online (Sandbox Code Playgroud)

这相当于:

int a1 = x; // a1 = 10, x = 10
int a2 = x--; // a2 = 10, x = 9
x = a1 + a2; // x = 20
Run Code Online (Sandbox Code Playgroud)

所以x是20后-这是在规范的保证.

什么是非常有保证的,虽然没有在规范中,是使用这种代码的人会被他们的同事的攻击.是的,结果是可预测的很好.不,使用那种代码并不好.

  • 不公平......不应该让Skeet回答这些问题.:P (9认同)
  • "......使用此类代码的任何人都会被他们的同事攻击......" (7认同)
  • @CAbbott - 遗憾的是没有其他人能理解x--和--x之间的区别! (3认同)

Eri*_*ert 15

乔恩当然是对的.

考虑这一点的好方法是记住:

1)子表达式总是从左到右进行评估.期.子表达的评估可能引起副作用.

2)操作符的执行总是按括号,优先级和关联性指示的顺序完成.操作员的执行可能会引起副作用.

+ =左边的"x"是最左边的子表达式,因此规则(1)适用.它的值首先计算 - 10.

+ =右边的x--是从左到右的顺序的下一个,所以接下来要进行评估.x--的值是10,副作用是x变为9.这是应该的,因为 - 优先级高于+ =,因此它的副作用首先运行.

最后,+ =的副作用最后运行.两个操作数分别为10和10,因此结果是将20分配给x.

我一直都有这个问题.请记住,规则非常简单:子表达式从左到右,运算符按优先顺序,周期.

特别要注意的是,通常所说的推理" - 运算符是后缀,因此在其他所有内容之后运行"是不正确的推理.我在下面的文章中讨论为什么这是不正确的.

以下是我就此主题撰写的一些文章:

http://blogs.msdn.com/ericlippert/archive/tags/precedence/default.aspx


bry*_*ker 14

20; 在评估完所有内容之后," - "才会发生,并且该值会被等于的左侧覆盖.

  • 你的名字不是Jon Skeet,但无论如何我都会赞成. (11认同)
  • 虽然你得到了正确的答案,但那里的逻辑是错误的."在所有事情得到评估之后才会发生"是误导性的.特别是,减量发生在9到x的赋值之前,这发生在添加10和10之前,这发生在20到x的赋值之前.递减的计算发生在一次加法和两次赋值之前,所以说直到*everything*得到评估才会发生它是不正确的. (4认同)

Mar*_*ers 10

规格7.13.2

如果所选运算符的返回类型可隐式转换为x的类型,则操作将计算为x = x op y,但x仅计算一次.

因此,您的陈述等同于x = x + x--;按从左到右的顺序进行评估并给出答案20.

请注意,这里--x和之间也存在差异x--.如果你写过x += --x;这相当于x = x + --x; 然后你得到19.这是因为x的值递减,结果值用在表达式中(与表达式x--中使用x的原始值不同).

这个表达式x = x + --x + x将给出28,因为第三次第四次(见注释)x被评估为9.