这个表情发生了什么? b = a +(a = a + 5)
a = 5 b = a + (a = a + 5)
结果b = 15
为什么第一个'a'之后不会改变(a = a + 5)? 但为什么第二个改变? 究竟在这里发生什么步骤?
expression式从左到右进行评估 – 总是,不pipe分组。 所以这相当于:
a = 5; int lhs = a; // 5 int rhs = (a = a + 5); // Increments a by 5 (ie a=10), and rhs=10 b = lhs + rhs; // 15
所以在这个执行之后, a
将会是10.但是只有在a
被评估为主加法的第一个操作数之后才会发生,这就是为什么结果是15而不是20。
了解评估顺序与优先级不一致的部分是非常重要的。 考虑一下:
int x = First() + Second() * Third();
优先级意味着乘法适用于调用Second()
和Third()
– 但First()
仍然First()
被计算。 换句话说,这句话相当于:
int lhs = First(); int rhs = Second() * Third(); int x = lhs + rhs;
有关更多详细信息,请参阅Eric Lippert的关于预测,关联性和订购的博客文章 。
我强烈build议不要这样写代码。
与C和C ++不同,子expression式的评估顺序在C#中保持不变。 这就是expression的原因
j= ++i + ++i ;
在C#中有明确定义的行为 ,而在C和C ++中未定义 。
在expression
b = a + (a = a + 5)
首先评估一个a,然后a+5
被评估并赋值给a
和两个被评估的子expression式之后, b
值将为15
。
expression式总是从左到右进行评估,然后分配给左边的任何东西。 如
a = 5 b = a + (a = a + 5) \\b = 5 + (a = 5 + 5) b = 15
我们总是从左到右工作, Parens只是把总和的一部分组合起来。所以只要记得总是从左到右。 我已经一步一步走下了
从问题开始
a = 5
b = a +(a = a + 5)
所以现在把第一个'a'换成5
b = 5 +(a = a + 5)
现在让我们做在parens的总和
b = 5 +(a = 5 + 5)
这给了我们
b = 5 + 10 或者你可以说 b = 5 +(a = 10)
答案是
b = 15
现在也是
a = 10