有趣的面试练习结果: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;",您可能会得到它。
这是一个简单的控制台应用程序代码,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;",您可能会得到它。