Порядок операций при работе с индексом массива - PullRequest
2 голосов
/ 06 октября 2011

Рассмотрим этот цикл:

int[] myArray = new int[10];

int myIndex = 0;
for (int i = 0; i < 10; i++)
{
    myArray[myIndex++] = myIndex;
    Console.WriteLine(myArray[i]);
}

Это дает:

1
2
3
...

Поскольку myIndex является постинкрементным, а правая часть вычисляется первой, не должен ли индекс массива 0 содержать 0?

Может ли кто-нибудь объяснить мне это недоразумение в порядке операций?

Ответы [ 5 ]

5 голосов
/ 06 октября 2011

Правая сторона не обязательно оценивается первой. Аналогично:

foo.Bar.Baz = a + b;

В приведенном выше коде сначала выполняется оценка foo.Bar, затем a + b, затем вызывается метод set_Baz, чтобы установить для свойства Baz значение, оцениваемое справа.

Итак, в вашем коде, если вы разбиваете его на части, это выглядит так:

var index = i;
// post-incremented in the original code means this comes after the line above,
// but not after the line below it.
i += 1; 
myArray[index] = i;
2 голосов
/ 06 октября 2011

первый запуск:

myArray[myIndex++] = myIndex;
           *            *
           |            |
         zero          one

myIndex++ выполняется после myArray[myIndex++], но любые последующие вызовы с уже увеличенной переменной.

0 голосов
/ 06 октября 2011

...

myArray[myIndex++] = myIndex;

... эквивалентно ...

int tmp = myIndex;
++myIndex;
myArray[tmp] = myIndex;
0 голосов
/ 06 октября 2011

Сначала оценивается myIndex++, затем левая сторона и, наконец, оператор присваивания в соответствии с приоритетом

0 голосов
/ 06 октября 2011

myIndex ++ выполняется до того, как значение задано, потому что индекс массива имеет прецедент, поэтому он знает, для какого индекса массива установить значение.

...