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

int x = 10; x += x--; 

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

看看这个声明:

 x += x--; 

这相当于:

 x = x + x--; 

这相当于:

 int a1 = x; // a1 = 10, x = 10 int a2 = x--; // a2 = 10, x = 9 x = a1 + a2; // x = 20 

所以x之后是20 – 这是由规格保证。

有一些保证,虽然不是规范,但任何使用这种代码的人都会受到同事的攻击。 是的,结果是可以预测的。 不, 使用这种代码并不好。

Jon当然是对的。

想想这个的好方法是记住:

1)子expression总是从左到右进行评估。 期。 评估子expression可能会引起副作用。

2)运算符的执行总是按照括号,优先级和关联性的顺序进行。 执行操作员可能会产生副作用。

+ =左边的“x”是最左边的子expression式,因此规则(1)适用。 其值是首先计算的 – 10。

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

最后,+ =的副作用最后。 两个操作数是10和10,所以结果是把20赋值给x。

我一直在问这个问题。 请记住,规则非常简单:子expression式从左到右,运算符优先顺序,句点。

尤其要注意的是,通常所说的“操作符是后缀,因此运行一切”是不正确的推理。 我在下面的文章中讨论这是不正确的。

以下是我在这个主题上写的一些文章:

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

20; 直到所有事情得到评估之后,才会发生“ – ”,并且该值被等号的左侧覆盖。

从规格7.13.2

如果所选运算符的返回types可隐式转换为x的types,则操作将评估为x = x op y,但x只计算一次。

所以你的陈述相当于x = x + x--; 按照从左到右的顺序进行评估并给出答案20。

请注意,这里也有一个区别--xx-- 。 如果你写了x += --x; 这将相当于x = x + --x ; 那么你会得到19.这是因为x的值递减,并且结果值被用在expression式中(不同于在expression式中使用x--的原始值的x-- )。

这个expression式x = x + --x + x会给出28,因为第四次(见注释)x的第三次被评估为9。

答案是20.而汤姆,你真的不像你的问题似乎意味着惊讶,对吧? 对于那些假设答案是19的人 – 我想你对x + = – x感到困惑;