Есть ли точка последовательности между этими назначениями? - PullRequest
14 голосов
/ 09 сентября 2011

Есть ли точка последовательности между двумя присвоениями в следующем коде:

f(f(x=1,1),x=2);

Ответы [ 6 ]

5 голосов
/ 09 сентября 2011

Нет, нет.Стандарт действительно неоднозначен в этом случае.

Если вы хотите подтвердить это, у gcc есть действительно крутая опция -Wsequence-point, и в этом случае он предупредит вас, что операция может быть неопределенной

3 голосов
/ 27 сентября 2011

Соответствующая цитата из (чернового) стандарта [6.5.2.2, 10]:

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

Так что для вашего выражения первый аргумент (в частности, вызов f) может быть оценен довторой аргумент;Например:

(x = 1, 1), f <sp> call, (x = 2), f <sp> call

Или, это может быть оценено после второго аргумента;Например:

(x = 2), (x = 1, 1), f <sp> call, f <sp> call

[Сам вызов функции может (и, скорее всего, будет) содержать больше точек последовательности (в частности, если он содержит оператор return).]

В зависимости от этогоесть точка последовательности между присваиваниями или нет.Это зависит от платформы («не определено»).

Поскольку во 2-м случае вы назначаете x дважды между двумя точками последовательности, на этой платформе поведение не определено.

3 голосов
/ 27 сентября 2011

В начале вызова функции и в ее конце есть точки последовательности.Однако, поскольку порядок операций над аргументами функции определяется реализацией, вы не можете гарантировать, что f(x=1,1) будет выполнен до x=2.

Также обратите внимание, что , в случае вызова функции не является оператор запятой , который вводит точку последовательности.

0 голосов
/ 27 сентября 2011

Да, будет точка последовательности из-за запятой operatror, ​​но результат все равно будет неопределенным, так как оценка аргументов функции не определена, поэтому не может предсказать, какое значение сгенерирует это выражение ........ означает неопределенное поведение

0 голосов
/ 09 сентября 2011

Существует точка последовательности, но порядок оценки (и их побочных эффектов) аргументов внешней функции все еще не определен.Реализация может сначала вычислить внутреннюю функцию f () с ее побочным эффектом x = 1 или второй аргумент с ее побочным эффектом x = 2.

0 голосов
/ 09 сентября 2011

Да, потому что есть точка последовательности до и после вызова функции.

§1.17.17 стандарта гласит:

При вызове функции (независимо от того, является ли функция встроенной), является точкой последовательности после оценки всех аргументов функции (если любой), который имеет место до выполнения каких-либо выражений или операторы в теле функции. Существует также точка последовательности после копирование возвращенного значения и перед выполнением любого выражения вне функции).

...