Почему это выражение в C99 было изменено в C11? - PullRequest
7 голосов
/ 07 мая 2020

C99 Standard:

Между предыдущей и следующей точкой последовательности сохраненное значение объекта должно быть изменено не более одного раза путем вычисления выражения.

C11 Standard :

Если побочный эффект на скалярный объект не упорядочен относительно другого побочного эффекта на тот же скалярный объект, поведение не определено.

Так было это определение стандарт C99 неполный и, следовательно, он был обновлен в C11, поскольку он содержит только термин object, а не scalar object?

1 Ответ

6 голосов
/ 07 мая 2020

Это потому, что C11 попытался охватить многопоточное / параллельное выполнение. Фундаментальные правила выполнения программы в «абстрактной машине» добавили этот громоздкий текст между C99 и C11 (C11 5.1.2.3/3) :

Последовательность перед асимметричной c, транзитивной, парой -опулярная связь между оценками, выполняемыми одним потоком, что приводит к частичному порядку среди этих оценок. Для любых двух оценок A и B, если A упорядочен до B, то выполнение A должно предшествовать выполнению B. (И наоборот, если A упорядочен до B, то B упорядочен после A.) Если A не упорядочен до или после B, то A и B не имеют последовательности. Вычисления A и B имеют неопределенную последовательность, когда A упорядочен либо до, либо после B, но не указано, какая именно 13) Наличие точки последовательности между вычислением выражений A и B подразумевает, что каждое вычисление значения и побочный эффект, связанный с A упорядочивается перед каждым вычислением значения и побочным эффектом, связанным с B. (Сводка точек последовательности приведена в приложении C.)

Следовательно, цитируемая вами часть (C99 6.5 / 2) была соответственно изменились, чтобы соответствовать определению выполнения программы в абстрактной машине, которое предположительно теперь также охватывает параллельное выполнение. К сожалению, поскольку текст C99 был намного более читабельным. Технически ничего не изменилось, если не рассматривать параллельное выполнение. Правила о точках последовательности из C99 по-прежнему применяются, это просто другая формулировка. Это изменение также означало синхронизацию C11 с C ++ 11, в котором действуют аналогичные правила.

...