Сегодня я прикрепил статью Эрик Липперт, где он пытался очистить миф между приоритетами операторов и порядком оценки, В конце было два фрагмента кода, которые меня смутили, вот первый фрагмент:
int[] arr = {0};
int value = arr[arr[0]++];
Теперь, когда я думаю о значении значения переменной, я просто вычисляю его как единое целое. Вот как я думал, что это работает.
- Сначала объявите arr как массив int с одним элементом внутри него; это значение элемента равно 0.
- Вторые получают значение arr [0] --0 в этот случай.
- Третий получить значение arr [значение шага 2] (который все еще равен 0) --gets arr [0] еще раз - до 0.
- Четвертое назначение значения шага 3 (0) к значению переменной. --value = 0 сейчас
- Добавьте к значению шага 2 1 - Теперь arr [0] = 1.
По-видимому, это неправильно. Я попытался выполнить поиск в спецификациях С# для некоторого явного утверждения о том, когда инкремент на самом деле происходит, но не нашел.
Второй фрагмент из комментария Eric сообщение в блоге на тему:
int[] data = { 11, 22, 33 };
int i = 1;
data[i++] = data[i] + 5;
Теперь, как я думаю, эта программа выполнит - после объявления массива и назначения 1 в i. [plz bear with me]
- Получить данные [i] --1
- Добавьте к значению шага 1 значение 5 - 6
- Присвоить данные [i] (который по-прежнему равен 1) значение шага 2 - данные [i] = 6
- Приращение я - я = 2
По моему мнению, этот массив теперь должен содержать значения {11, 27, 33}. Однако, когда я зациклился, чтобы напечатать значения массива, я получил: {11, 38, 33}. Это означает, что шаг post произошел до разыменования массива!
Как так? Разве этот пост не должен быть пост? то есть после всего остального.
Что я пропущу парней?