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