Когда вы используете оптимизацию с gcc, он может использовать определенные предположения, основанные на типе выражений, чтобы избежать повторения ненужных чтений и разрешить сохранение переменных в памяти.
Ваш код имеет неопределенное поведение, поскольку вы приводите указательна long long
(который gcc допускает в качестве расширения) на указатель на int
и затем манипулирует указанным на объект, как если бы это был int
.Указатель на int
обычно не может указывать на объект типа long long
, поэтому gcc может допустить, что операция, записывающая в int
(через указатель), не повлияет на объект, имеющий тип long long
.
Поэтому вполне законно кэшировать значение n
между временем, в которое оно было первоначально присвоено, и временем, в которое оно впоследствии печатается.Нет допустимая операция записи могла изменить свое значение.
Конкретный переключатель и документация для чтения - -fstrict-aliasing
.