什么时候int ++增加?

时间:2010-11-30 03:17:16

标签: c# visual-studio-2010

我有一行代码,

list[index++] = recursiveFunction();

在调用index之前或之后,recursiveFunction是否会增加?

2 个答案:

答案 0 :(得分:8)

增量操作在执行函数调用之前执行。见http://msdn.microsoft.com/en-us/library/aa691322(v=VS.71).aspx。请注意,这与运算符的优先级和关联性无关。

  

表达式中运算符的求值顺序由运算符的优先级和关联性决定(第7.2.1节)。

     

表达式中的操作数从左到右进行评估。例如,在F(i) + G(i++) * H(i)中,使用旧值i调用方法F,然后使用旧值i调用方法G,最后,使用新值i调用方法H.这与运算符优先级分开,无关。

运算符优先级和关联性仅影响运算符绑定到操作数的方式。这里的问题讨论了操作数评估的副作用

using System;

class Obj {
   public bool Incremented {get;set;}
   public static Obj operator ++ (Obj o) {
     Console.WriteLine("Increment operator is executed.");
     return new Obj {Incremented = true};
   }
}

class L {
  public int this[Obj o] {
    set { Console.WriteLine("Assignment called with " + 
            (o.Incremented ? "incremented" : "original") + " indexer value."); }
  }

}
class Test{
  static void Main() {
    Obj o = new Obj();
    L l = new L();
    l[o++] = Func();
  }

  static int Func() {
    Console.WriteLine("Function call.");
    return 10;
  }
}

打印:

Increment operator is executed.
Function call.
Assignment called with original indexer value.

此行为在规范中明确指定 ,并且在任何符合标准的编译器中都应该相同。

答案 1 :(得分:5)

在Windows上的Visual Studio 2008 / .NET Framework 3.5下,在调用 recursiveFunction之前,索引会增加。此示例应用程序将“index = 1”打印到控制台。

class Program
{
    private int index = 0;

    private static void Main()
    {
        new Program().TryMe();
    }

    private void TryMe()
    {
        var list = new List<int>();
        list.Add(1);
        list.Add(2);

        list[index++] = ReturnZero();
    }

    private int ReturnZero()
    {
        Console.WriteLine(string.Format("index = {0}", index));
        return 0;
    }
}