这个表情是怎么回事?b = a + (a = a + 5)
本文关键字:怎么回事 | 更新日期: 2023-09-27 18:37:23
a = 5
b = a + (a = a + 5)
结果 b = 15
为什么第一个"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