Возrotation переменной при использовании приращения post в C

У меня есть глобальная переменная var и функция foo . (Я знаю, что это плохая практика, но иногда это неизбежно) Мне интересно, если стандарт C (я компилирую с использованием c99) говорит, что происходит с var если я пытаюсь выполнить:

 long foo(){ return var++; } 

Благодарю.

Короткий ответ:

Он вернет копию var а затем сразу же добавит глобальный var .

Длительный ответ:

C11 6.5.2.4

«Результатом оператора postfix ++ является значение операнда. В качестве побочного эффекта значение объекта операнда увеличивается.». / – / Вычисление значения результата секвенируется перед побочным эффектом обновления сохраненного значения операнда.

Стандарт 5.1.2.3 «Выполнение программы» указывает, что все побочные эффекты должны быть оценены до того, как программа встретит точку последовательности . (Здесь можно найти множество точек последовательности).

После оператора return появляется точка последовательности (C11 6.8 / 4).

Это означает, что выражение var++ гарантированно будет полностью оценено до того, как будет продолжен какой-либо код в main ().

Ваш машинный код будет выглядеть как этот псевдокод:

  • Сохраните локальную копию var в стеке (или в регистре и т. Д.).
  • Увеличьте глобальный var с помощью 1.
  • Возврат из подпрограммы.
  • Используйте «copy-of- var ».

Если бы вы использовали приращение префикса вместо этого, операция увеличения была бы секвенирована до того, как копия была сохранена.

Поскольку var++ является пост-инкрементом, это в основном примерно так:

 long foo(){ long tmp = var; var++; return tmp; } 

Если вместо этого вы используете переменную ++var , она вернет инкрементное значение (так как оно будет увеличивать переменную перед возвратом ее значения).

foo() вернет текущее значение var , а var будет увеличено.