Вы должны быть осторожны, веря слову «после». Это правда, что в этом примере поведение выглядит так, как будто указатели увеличиваются после присваивания, но компилятор C не обязан фактически выполнять действия в таком порядке, так как Пока результат один и тот же.
В частности, есть следующие шаги:
- Получить значение sp (назовите его sp0)
- Получить значение tp (назовите его tp0)
- Рассчитать sp0 + 1 (назовите это sp1)
- Рассчитать tp0 + 1 (назовите его tp1)
- Хранить sp1 в sp
- Магазин tp1 на tp
- Используйте sp0 для получения значения (назовите его v)
- Используйте tp0 для хранения v
Единственные ограничения порядка - это очевидные ограничения: значения должны быть доступны до их использования. Вы не можете знать и не должны пытаться угадать, какой порядок выберет компилятор. С другой стороны, точка с запятой (терминатор оператора) является «точкой последовательности», сообщающей компилятору о том, что ему нельзя переупорядочивать эффекты через него - если только он не может доказать, что он не меняет результат (но может быть быстрее, например).
Это в основном актуально, если вы пытаетесь использовать одну и ту же переменную-указатель более одного раза в одном и том же выражении, но даже в вашем примере это может иметь значение, если ваши указатели указывают на себя.