预增量运算符如何处理变量赋值(如+=++a)



作为一名初学者,我很难理解下面的代码。我预计a会增加两次,结果会是2,但事实并非如此。

var a = 0;
a += ++a;
Console.WriteLine(a); // 1

似乎有一个值被降低了。如何理解?

嗯,a += n相当于a = a + n

因此a += ++a;等价于a = a + ++a;

反过来,这相当于a = a + (a + 1);

用你的a值代替,我们得到a = 0 + (0 + 1);

请记住,表达式中的操作数是从左到右计算的。Eric Lippert在这里深入探讨了评估顺序。

这在实践中意味着什么?

如果我们写a = a + ++a;a将变成1,因为第一个a在求值时为0,然后在++a中变成1,这意味着整个赋值是1的值。

如果我们稍微颠倒一下,改为写a = ++a + a;,那么++a将计算1,当我们到达第二个a时,它已经是1,这意味着我们实际上有a = 1 + 1;,所以我们得到2。

您可以使用以下代码进行验证:

var a = 0;
a = a + ++a;
var b = 0;
b = ++b + b;
Console.WriteLine(a); // 1
Console.WriteLine(b); // 2

在线试用

最新更新