Операторы синтаксически допустимы как до, так и после изменения. Но все равно проблема останется. Если вы изменяете объект в аргументе, а порядок оценки не указан.
C99 Раздел 6.5.2.2 Параграф 10
Порядок вычисления указателя функции, фактических аргументов и подвыражений в фактических аргументах не определен, но перед фактическим вызовом есть точка последовательности.
Согласно Разделу 3.4.4 Параграф 1
неопределенное поведение
использование неопределенного значения или другое поведение, если настоящий международный стандарт предоставляет две или более возможностей и не налагает дополнительных требований, которые выбираются в любом случае.
С другой стороны, в разделе 3.4.3, параграф 1 говорится
неопределенное поведение
поведение при использовании непереносимой или ошибочной программной конструкции или ошибочных данных, для которых настоящий стандарт не устанавливает требования
В случае порядка или оценки это может быть сделано в любом порядке, в зависимости от того, как компилятор генерирует код, он может хранить в памяти в любом порядке, а также может передавать аргументы через регистр. После того, как код сгенерирован, двоичный файл будет везде вести себя одинаково. Поэтому для одного единственного двоичного файла результаты будут каждый раз одинаковыми, но в зависимости от решения компилятора все может измениться.
Лучше всего избегать всего, что кажется неправильным или причудливым. Если есть сомнения, возможно, это неопределенное, неопределенное поведение, определяемое реализацией. Поэтому вы можете сделать то же самое однозначным и детерминированным следующим образом.
test (i, i+1);
i += 2;
OR
test (i+1, i);
i+= 2;
В зависимости от того, какой порядок вы хотите.
person
phoxis
schedule
08.05.2015
,
в аргументах — это точка последовательности; только порядок оценки аргументов *unspecified. Нет неопределенного поведения. - person Antti Haapala   schedule 10.05.2015