Есть ли точка последовательности между этими назначениями?

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

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