这个表情是怎么回事?b = a + (a = a + 5)

本文关键字:怎么回事 | 更新日期: 2023-09-27 18:37:23

a = 5
b = a + (a = a + 5)

结果 b = 15

为什么第一个"a"在那之后没有变化(a = a + 5)?但为什么第二个会改变呢?这里到底在分步发生什么?

这个表情是怎么回事?b = a + (a = a + 5)

表达式从左到右计算 - 始终,无论分组如何。所以它相当于:

a = 5;
int lhs = a; // 5
int rhs = (a = a + 5); // Increments a by 5 (i.e. a=10), and rhs=10
b = lhs + rhs; // 15

因此,在执行之后,a将是 10。但这只会在对主加法的第一个操作数a进行评估之后发生,这就是为什么结果是 15 而不是 20。

了解评估顺序与优先级不同的部分非常重要。考虑一下:

int x = First() + Second() * Third();

优先级意味着乘法适用于调用 Second()Third() 的结果 - 但仍首先评估First()。换句话说,此语句等效于:

int lhs = First();
int rhs = Second() * Third();
int x = lhs + rhs;

有关更多详细信息,请参阅Eric Lippert关于偏好,关联性和排序的博客文章。

不过,我强烈建议不要编写这样的代码。

与 C

和 C++ 不同,子表达式的计算顺序在 C# 中从左到右。这就是为什么表达

j= ++i + ++i ;   

在 C# 中具有明确定义的行为,而在 C 和 C++ 中未定义

在表达式中

b = a + (a = a + 5)  

a将首先被计算,然后a+5被计算并分配给a,在添加两个计算的子表达式后,b将具有值15

表达式总是从左到右计算,然后分配给左手上的任何内容。如

  a = 5
  b = a + (a = a + 5)
''b = 5 + (a = 5 + 5)
  b = 15

我们总是从左到右工作,括号只是将总和的一部分分组。所以只要记住总是从左到右。我在下面一步一步地走

从问题开始

a = 5

b = a +

(a = a + 5)

所以现在将第一个"a"更改为 5

b = 5 +

(a = a + 5)

现在让我们在括号中做总和

b = 5 +

(a = 5 + 5)

这给了我们

b = 5 + 10,

或者你可以说 b = 5 + (a = 10)

答案是

b = 15

也是现在

a = 10