Когда препроцессор читает строку, он заменяет MAX (a ++, b ++) в printf на (a ++> b ++? A ++; b ++)
Таким образом, ваша функция становится
printf(a,b,(a++>b++?a++;b++));
Здесь порядок вычисления «зависит от компилятора».
Чтобы понять, когда могут возникнуть эти условия, вам нужно понять точку последовательности.
В каждой точке последовательности - побочные эффекты всех предыдущих выражений.будет завершено (все переменные вычисления будут завершены).Вот почему вы не можете полагаться на выражения, такие как:
a[i] = i++;
, поскольку для операторов присваивания, приращения или индекса не указана точка последовательности, вы не знаете, когда произойдет влияние приращения на i,«Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значение, измененное не более одного раза путем оценки выражения.Кроме того, предыдущее значение должно быть прочитано только для определения значения, которое будет сохранено ».Если программа нарушает эти правила, результаты в любой конкретной реализации являются совершенно непредсказуемыми (неопределенными).
- Точки последовательности, изложенные в Стандарте, следующие:
1) Точкавызова функции после вычисления ее аргументов.
2) Конец первого операнда оператора &&.
3) Конец первого операнда ||operator.
4) Конец первого операнда условного оператора?:
5) Конец каждого операнда оператора запятой.
6)Завершение оценки полного выражения.Они следующие:
Оценка инициализатора автообъекта.
Выражение в «обычном» выражении - выражение, за которым следует точка с запятой.
Управляющие выражения всделать, в то время как, если, переключить или для операторов.
Два других выражения в операторе для.
Выражение в операторе возврата.