有趣的面试锻炼结果:返回,增量和参考行为
这是一个简单的控制台应用程序代码,它返回一个我完全不理解的结果。
试着想一下,在控制台中输出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” 也许你会得到它。