Есть ли точка последовательности между этими назначениями?
Есть ли точка последовательности между двумя назначениями в следующем коде:
f(f(x=1,1),x=2);
Ответы
Ответ 1
Соответствующая цитата из (черновик) стандарта [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
).]
В зависимости от этого, существует точка последовательности между назначениями или нет.
Это зависит от платформы ( "undefined" ).
Поскольку во втором случае вы назначаете x
дважды между двумя точками последовательности, у вас есть поведение undefined на такой платформе.
Ответ 2
Нет, нет. В этом случае стандарт действительно двусмыслен.
Если вы хотите подтвердить, что gcc имеет эту действительно классную опцию -Wsequence-point
, и в этом случае она предупредит вас, что операция может быть undefined
Ответ 3
Есть точки последовательности в начале вызова функции и в конце. Однако, поскольку порядок операций над аргументами функции определяется реализацией, вы не можете гарантировать, что f(x=1,1)
будет выполняться до x=2
.
Также обратите внимание, что ,
в случае вызова функции не является оператором запятой, который вводит точку последовательности.
Ответ 4
Существует точка последовательности, но порядок оценки (и их побочных эффектов) аргументов внешней функции по-прежнему undefined. Реализация может сначала оценить внутреннюю f() с ее побочным эффектом x = 1 или вторым аргументом с его побочным эффектом x = 2.
Ответ 5
Да, потому что есть точка последовательности до и после вызовов функций.
В §1.1.17 Стандарта говорится:
При вызове функции (независимо от того, является ли функция встроенной), является точкой последовательности после оценки всех аргументов функции (если любой), который имеет место до выполнения любых выражений или утверждения в теле функции. Также имеется точка последовательности после копирование возвращаемого значения и до выполнения любого выражения вне функции).
Ответ 6
Да, будет точка последовательности из-за запятой. Но результат будет undefined, поскольку оценка аргументов функции undefined, поэтому не может предсказать, какое значение вырастет это выражение........ означает поведение undefined