有趣的面试练习结果:return, post increment and ref behavior

Interesting interview exercise result: return, post increment and ref behavior

这是一个简单的控制台应用程序代码,returns结果我完全看不懂。

试想控制台输出的是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。

我不明白的是为什么 post 从 Increment 方法中递增 i++,它是在 ref 上执行的(而不是在传递的变量)确实会增加变量,但稍后会被忽略。

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

谁能解释一下这个例子,以及为什么在调试期间我看到该值增加到 1,但随后又回到 0?

i += Increment(ref i); 等同于

i = i + Increment(ref i);

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

i = 0 + Increment(ref i);

return i++ returns i 的当前值(即 0),然后递增 i

i = 0 + 0;

在赋值之前 i 的值是 1(在 Increment 方法中递增),但赋值后它又变成了 0。

我认为这里的"magic"只是操作优先级操作顺序

i += Increment(ref i)

相同
i = i + Increment(ref i)

+操作从左到右执行

所以首先我们取 i ... 当时为 0 ...

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

增量发生在我们的 + 操作的左操作数被评估之后......所以它不会改变任何事情...... 0+0 仍然是 0 ...因此 i 在 + 之后被分配 0操作已执行

如您所述 - 后增量 "i++"。语句 - "return i++;" 将在返回原始值后在内存中设置 'i' 的值。

尝试使用 "return ++i;",您可能会得到它。