关于C#:int x=10;x+=x–

int x = 10; x += x--; in .Net - Why?

1
2
int x = 10;
x += x--;

在c/.net中,为什么它等于它的值?(我故意把答案漏掉,这样你就可以猜出来,看你是不是对了)


看看这句话:

1
x += x--;

这相当于:

1
x = x + x--;

相当于:

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

因此,x之后是20——这是规范所保证的。

虽然规范中没有这样的规定,但也可以很好地保证,任何使用这种代码的人都会受到同事的攻击。是的,结果是可以预测的,这很好。不,使用这种代码不好。


乔恩当然是对的。

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

1)子表达式始终从左到右进行计算。时期。评估子表达可能会引起副作用。

2)运算符的执行始终按照括号、优先级和关联性指示的顺序进行。执行操作可能会产生副作用。

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

+=右边的x——是从左到右的下一个顺序,所以接下来对它进行计算。x的值是10,副作用是x变成9。这是应该的,因为--的优先级高于+=,所以它的副作用首先运行。

最后,+=的副作用持续到最后。两个操作数分别是10和10,所以结果是将20赋给X。

我一直都有关于这个的问题。记住,规则非常简单:从左到右的子表达式、按优先级排列的运算符、句点。

特别要注意的是,通常所说的推理"操作符是后缀,因此在所有其他操作之后运行"是错误的推理。我在下面的文章中讨论了为什么这是不正确的。

以下是我写的关于这个主题的一些文章:

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


20;只有在对所有内容进行评估之后,"-"才会发生,并且该值将被等号的左侧覆盖。


根据规范7.13.2

If the return type of the selected operator is implicitly convertible to the type of x, the operation is evaluated as x = x op y, except that x is evaluated only once.

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

注意,这里的--xx--也有区别。如果你写了x += --x;,这相当于x = x + --x,那么你会得到19。这是因为x的值是递减的,结果的值用在表达式中(与x--不同,x的原始值用在表达式中)。

这个表达式x = x + --x + x将给出28,因为第三次的x被计算为9。


答案是20。汤姆,你真的不像你的问题所暗示的那样惊讶,对吧?对于那些假设答案是19的人来说,我认为你和x+=--x混淆了;