Когда препроцессор читает строку, он заменяет MAX(a++,b++) в printf на (a++>b++?a++;b++)
Таким образом, ваша функция становится
printf(a,b,(a++>b++?a++;b++));
Здесь порядок оценки "зависит от компилятора".
Чтобы понять, когда могут возникнуть эти условия, вам нужно понять точку последовательности.
В каждой точке последовательности будут завершены побочные эффекты всех предыдущих выражений (все вычисления переменных будут завершены). Вот почему вы не можете полагаться на такие выражения, как:
a[i] = i++;
поскольку для операторов присваивания, приращения или индекса не указана точка последовательности, вы не знаете, когда происходит эффект приращения на i. «Между предыдущей и следующей точкой последовательности сохраненное значение объекта должно быть изменено не более одного раза путем вычисления выражения. Кроме того, предыдущее значение должно считываться только для определения значения, которое необходимо сохранить». Если программа нарушает эти правила, результаты любой конкретной реализации будут совершенно непредсказуемыми (неопределенными).
--Точки последовательности, изложенные в Стандарте, следующие:
1) Точка вызова функции, после оценки ее аргументов.
2) Конец первого операнда оператора &&.
3)Конец первого операнда || оператор.
4) Конец первого операнда условного оператора ?:.
5) Конец каждого операнда оператора запятой.
6) Завершение оценки полного выражения. Они следующие:
Оценка инициализатора автоматического объекта.
Выражение в «обычном» операторе — выражение, за которым следует точка с запятой.
Управляющие выражения в операторах do, while, if, switch или for.
Два других выражения в операторе for.
Выражение в операторе возврата.
person
Anurag
schedule
15.09.2011
strlen(++s)
увеличиваетs
ровно один раз, но если вы все равно хотите избежать макроса, вы можете вместо этого написать(strlen)(++s)
, что не является информацией о макросе. Авторы сторонних библиотек могут предоставлять или не предоставлять эти полезные гарантии, если они предоставляют вещи, о которых они не сообщают вам, являются ли они функциями или макросами. - person Steve Jessop   schedule 15.09.2011