我有一行代码,
list[index++] = recursiveFunction();
在调用index
之前或之后,recursiveFunction
是否会增加?
答案 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;
}
}