Стандарт C99 говорит в $6.5.2.
Между предыдущей и следующей точкой последовательности объект должен иметь сохраненное значение не более чем один раз, оценивая выражение. Кроме того, предыдущее значение должны быть прочитаны только для определения значения, которое нужно сохранить.
(выделение мной)
Далее следует отметить, что следующий пример действителен (что кажется очевидным вначале)
a[i] = i;
Пока он явно не указывает, что a
и i
.
Хотя я считаю, что этого не происходит, я хотел бы знать, охватывает ли этот пример следующий случай:
int i = 0, *a = &i;
a[i] = i;
Это не изменит значение i
, но получите доступ к значению i
, чтобы определить адрес, куда поместить значение. Или не имеет значения, что мы присваиваем значение i
, которое уже хранится в i
? Просветите свет.
Бонусный вопрос; Что насчет a[i]++
или a[i] = 1
?