2010-11-30 2 views
4

У меня есть строка кода,Когда int ++ увеличивается?

list[index++] = recursiveFunction(); 

ли index получить увеличивается до или после вызова recursiveFunction?

+1

Возможно, это зависит от реализации. – 2010-11-30 03:20:24

+1

Ты говоришь мне, что нет стандарта? – mpen 2010-11-30 03:22:01

ответ

8

Операция приращение выполняется перед тем вызова функции. См. http://msdn.microsoft.com/en-us/library/aa691322(v=VS.71).aspx. Обратите внимание, что это не относится к приоритетности и ассоциативности операторов.

Порядок оценки операторов в выражении определяется приоритетом и ассоциативностью операторов (раздел 7.2.1).

Операнды в выражении оцениваются слева направо. Например, в F(i) + G(i++) * H(i) метод F вызывается с использованием старого значения i, тогда метод G вызывается со старым значением i, и, наконец, метод H вызывается с новым значением i. Это отдельно от и не связано с приоритетом оператора.

Приоритет и ассоциативность операторов влияют только на то, как операторы привязаны к операндам. Здесь обсуждается побочные эффекты оценки операндов.

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. 

Такое поведение четко указано в описании и должны быть одинаковыми в любом соответствующем компиляторе.

5

В Visual Studio 2008/.NET Framework 3.5 в Windows индекс увеличивается до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; 
    } 
} 
Смежные вопросы