返回参考值时的不明确行为

时间:2015-11-27 11:09:03

标签: c#

我有一段代码:

using System;

public class Program
{
    private static int Incr(ref int i)
    {
        return i++;
    }
    public static void Main()
    {
        var i = 0;
        i += Incr(ref i);
        Console.WriteLine(i);
    }
}

Console.WriteLine(i)会给我们“0”。但是在没有“+ =”的情况下调用Incr(ref i)

var i = 0;
Incr(ref i);
Console.WriteLine(i);

会给我们“1”。怎么可能?

2 个答案:

答案 0 :(得分:8)

i += Incr(ref i)视为

i = i + Incr(ref i);

换句话说:

  • 评估i
  • 致电Incr(ref i)
  • 将两个操作数一起添加
  • 分配到i

现在Incr(ref i)i设置为1,但返回 0 ...因此总和最终为0 + 0,然后分配给{{1} }。在i返回且结果被分配回i之间的时间内,Incr的值非常暂时 1。

如果你有:

i

然后你最终得到int j = i + Incr(ref i);

调用j=0, i=1时,Incr(ref i)会增加Incr(因此i为1),然后忽略返回值。那么i之后就是1。

在其他新闻中:应该不惜一切代价避免这样的代码。

答案 1 :(得分:0)

您的代码的作用:

  • 编译器内部重写:db.select('SELECT * FROM users'); 变为i += Incr(ref i);(这就是i = i + Incr(ref i);所做的事情。)
  • 评估+=i +为0; 结果A
  • 致电i Incr(ref i)为0;
  • 返回ii仍为0. 结果B
  • 在返回值后执行i增加i。由于i++已作为i传递:ref为1,但i在评估中没有任何作用,因为i已经过评估!
  • 将结果A(0)添加到结果B(0)。结果:0。