Когда происходит последовательность точек, это в основном означает, что вам гарантировано, что все предыдущие операции будут завершены.
Изменение переменной дважды без промежуточной точки последовательности является одним из примеров неопределенного поведения.
Например, i = i++;
не определено, поскольку между двумя изменениями не существует точки последовательности, равной i
.
Wikipedia имеет list of the sequence points в стандартах C и C++, хотя окончательный список всегда следует брать из стандарта ISO. Из C99 Приложение C:
Ниже приведены последовательности точки, описанные в 5.1.2.3:
- Вызов функции, после того, как аргументы были оценены (6.5.2.2).
- Конец первого операнда следующих операторов: логический И & & (6.5.13); логический ИЛИ || (6.5.14); условный? (6.5.15); запятая, (6.5.17).
- Конец полного декларатора: деклараторы (6.7.5);
- Конец полного выражения: инициализатор (6.7.8); выражение в выражении (6.8.3); управляющее выражение оператора выбора (если или переключатель) (6.8.4); управляющее выражение while или do (6.8.5); каждое из выражений оператора for (6.8.5.3); выражение в операторе возврата (6.8.6.4).
- Непосредственно перед возвратом функции библиотеки (7.1.4).
- После выполнения действий, связанных с преобразованием функции форматированного ввода/вывода (7.19.6, 7.24.2).
- Непосредственно перед каждым вызовом функции сравнения и также между любым вызовом функции сравнения и любым перемещением объектов , переданных в качестве аргументов для этого вызова (7.20.5).
C11 имеет формулировку изменилось. Это, кажется, вспыхивает тройной оператор и добавил еще несколько деталей:
Ниже приведены точки последовательности, описанные в 5.1.2.3:
- Между оценок функции целеуказателя и фактическими аргументов в функции вызов и фактический вызов. (6.5.2.2).
- Между оценками первого и второго операндов следующих операторов: логический И & & (6.5.13); логический ИЛИ || (6.5.14); запятая, (6.5.17).
- Между оценками первого операнда условного оператора: , в зависимости от того, какой из второго и третьего операндов оценивается (6.5.15).
- Конец полного декларатора: деклараторы (6.7.6);
- Между оценкой полного выражения и следующего полного выражения должно быть оценено. Ниже приведены полные выражения: инициализатор (6.7.9); выражение в выражение выражение (6.8.3); управляющее выражение оператора выбора (если или переключатель) (6.8.4); контролирующее выражение a while или do statement (6.8.5); каждое из выражений оператора for (6.8.5.3); выражение в операторе возврата (6.8.6.4).
- Непосредственно перед возвратом функции библиотеки (7.1.4).
- После выполнения действий, связанных с преобразованием функции форматированного ввода/вывода (7.21.6, 7.28.2).
- Непосредственно перед каждым вызовом функции сравнения и также между любыми вызовами функции сравнения и любым перемещением объектов , переданных в качестве аргументов для этого вызова (7.22.5).
Возможный дубликат [Последовательности и частичный порядок] (http://stackoverflow.com/questions/1895922/sequence-points-and-partial-order) – jev