Не указано, какой из аргументов +
оценивается первым - но это и не важно, потому что в C и C++ модификация одного и того же объекта дважды без промежуточной точки следования является совершенно неопределенным поведением.
Здесь вы изменяете x
три раза без промежуточной точки последовательности, так что вы уже на территории here be dragonnes ;)
Соответствующая часть стандарта C99 - "6.5 Expressions":
2 Between the previous and next точкой последовательности объект должен иметь его хранимое значение изменяется не более одного раза в результате оценки выражения. Более того, предыдущее значение должно быть считываться только для определения значения, которое будет сохранено.
и
3 Группировка операторов и операндов обозначается синтаксисом. За исключением случаев, указанных далее (для функции-вызова (), &&, ||, ?:, и операторов-запятых), порядок порядок оценки подвыражений и порядок возникновения побочных эффектов не определены.
Можно написать легальный код, демонстрирующий неопределенный порядок оценки - например:
#include <stdio.h>
int foo(void)
{
puts("foo");
return 1;
}
int bar(void)
{
puts("bar");
return 2;
}
int main()
{
int x;
x = foo() + bar();
putchar('\n');
return x;
}
(Не определено, получите ли вы на выходе foobar
или barfoo
).
Стандарт C++03 5.4
За исключением случаев, когда это указано, порядок порядок оценки операндов отдельных операторов и подвыражений отдельных выражений, и порядок в котором происходят побочные эффекты, является не определены.53) Между предыдущей и следующей точкой последовательности скалярный объект должен иметь свое хранимое значение изменяется не более одного раза в результате оценкой выражения. Более того, предыдущее значение должно быть только для определения значения которое будет сохранено. Требования этого параграфа должны быть выполнены для каждого допустимого упорядочения подвыражений полного выражения; в противном случае поведение не определено.
... следовательно, не определено и зависит от реализации.
Это не корректный оператор языка Си, поэтому говорить о порядке оценки не имеет смысла.
Стандарт C не гарантирует, что пост-инкремент действительно "произойдет" после пре-инкремента. Так что это неопределенное поведение.