有趣的面试锻炼结果:返回,增量和参考行为

这是一个简单的控制台应用程序代码,它返回一个我完全不理解的结果。

试着想一下,在控制台中输出0,1还是2:

using System; namespace ConsoleApplication { class Program { static void Main() { int i = 0; i += Increment(ref i); Console.WriteLine(i); Console.ReadLine(); } static private int Increment(ref int i) { return i++; } } } 

答案是0。

我不明白的是为什么递增i++ ,从Increment方法,这是执行一个ref (而不是在传递variables的副本)增加variables,但它只是稍后被忽略。

我的意思是在这个video中:

有人可以解释这个例子,为什么在debugging期间,我看到值增加到1,但它回到0?

i += Increment(ref i); 相当于

 i = i + Increment(ref i); 

赋值右边的expression式从左到右计算,所以下一步是

 i = 0 + Increment(ref i); 

return i++返回i (它是0)的当前值,然后增加i

 i = 0 + 0; 

在赋值之前, i的值是1(在Increment方法中Increment ),但是赋值再次为0。

我认为这里的“魔术”只是操作的先后顺序

 i += Increment(ref i) 

是相同的

 i = i + Increment(ref i) 

+操作从左到右执行

所以首先我们把我…当时是0 …

那么我们加上Increment(ref i)…的结果也是0 … 0 + 0 = 0 …但是等到…在我们得到结果之前我实际上是递增的…

在我们的+操作的左操作数已经被评估之后,增量发生…所以它不改变事物… 0 + 0仍然是0 …因此在+操作已经被执行之后,i被赋值为0

正如你所提到的 – postincrement“i ++”。 语句 – “返回i ++;” 将原始值返回后,将“i”的值设置在内存中。

尝试使用“return ++ i” 也许你会得到它。