У меня есть строка кода,Когда int ++ увеличивается?
list[index++] = recursiveFunction();
ли index
получить увеличивается до или после вызова recursiveFunction
?
У меня есть строка кода,Когда int ++ увеличивается?
list[index++] = recursiveFunction();
ли index
получить увеличивается до или после вызова recursiveFunction
?
Операция приращение выполняется перед тем вызова функции. См. 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.
Такое поведение четко указано в описании и должны быть одинаковыми в любом соответствующем компиляторе.
В 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;
}
}
Возможно, это зависит от реализации. – 2010-11-30 03:20:24
Ты говоришь мне, что нет стандарта? – mpen 2010-11-30 03:22:01