Соответствующая цитата из (чернового) стандарта [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
дважды между двумя точками последовательности, на этой платформе поведение не определено.