作为一名初学者,我很难理解下面的代码。我预计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
在线试用