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后-这是在规范的保证.
什么是也非常有保证的,虽然没有在规范中,是使用这种代码的人会被他们的同事的攻击.是的,结果是可预测的很好.不,使用那种代码并不好.
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; 在评估完所有内容之后," - "才会发生,并且该值会被等于的左侧覆盖.