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。
请注意,这里也有一个区别--x
和x--
。 如果你写了x += --x;
这将相当于x = x + --x
; 那么你会得到19.这是因为x的值递减,并且结果值被用在expression式中(不同于在expression式中使用x--
的原始值的x--
)。
这个expression式x = x + --x + x
会给出28,因为第四次(见注释)x的第三次被评估为9。
答案是20.而汤姆,你真的不像你的问题似乎意味着惊讶,对吧? 对于那些假设答案是19的人 – 我想你对x + = – x感到困惑;