这个表情发生了什么? 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