有趣的面试练习结果:返回,后增量和ref行为

时间:2017-04-21 10:02:07

标签: c# increment operator-precedence ref

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

尝试考虑它是否在控制台中输出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为什么会增加ListView(而不是传递的变量的副本)变量,但稍后会被忽略。

我的意思是在这个视频中:

有人可以解释一下这个例子以及为什么在调试过程中我看到该值增加到1,然后又回到0?

3 个答案:

答案 0 :(得分:102)

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

i = i + Increment(ref i);

分配右侧的表达式从左到右进行评估,因此下一步是

i = 0 + Increment(ref i);

return i++返回i的当前值(为0),然后递增i

i = 0 + 0;

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

答案 1 :(得分:18)

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

i += Increment(ref i)

相同
i = i + Increment(ref i)

+操作从左到右执行

所以首先我们拿...我当时是0 ...

然后我们添加Increment(ref i)的结果......这也是0 ... 0 + 0 = 0 ...但等待......在得到结果之前我实际上是递增... < / p>

该增量发生在我们的+操作的左操作数已经被评估之后...所以它不会改变一个东西... 0 + 0仍然是0 ...因此我在+操作之后被赋值为0已被执行

答案 2 :(得分:0)

如你所述 - postincrement&#34; i ++&#34;。声明 - &#34;返回i ++;&#34;将设置&#39; i&#39;的值在原始值返回后的内存中。

尝试使用&#34; return ++ i;&#34;也许你会得到它。