Все аргументы оцениваются. Заказ не определен (согласно стандарту). Но все реализации C / C ++ (которые я знаю) оценивают аргументы функции от справа налево . РЕДАКТИРОВАТЬ: CLang является исключением (см. Комментарий ниже).
Я считаю, что порядок оценки справа налево был очень очень старым (со времен первых компиляторов Си). Конечно, задолго до того, как был изобретен C ++, и большинство реализаций C ++ сохраняли бы тот же порядок оценки, потому что ранние реализации C ++ просто переводились на C.
Есть несколько технических причин для оценки аргументов функции справа налево. В стековых архитектурах аргументы обычно помещаются в стек. В C / C ++ вы можете вызывать функцию с большим количеством аргументов, чем указано на самом деле - дополнительные аргументы просто игнорируются. Если аргументы вычисляются слева направо и перемещаются слева направо, то слот стека прямо под указателем стека будет содержать последний аргумент, и функция не сможет получить смещение любого конкретного аргумента (потому что фактическое количество выдвинутых аргументов зависит от вызывающего).
В порядке выталкивания справа налево слот стека прямо под указателем стека всегда будет содержать первый аргумент, а следующий слот содержит второй аргумент и т. Д. Смещения аргумента всегда будут детерминированными для функции (которая может быть записанным и скомпилированным в другом месте в библиотеку, отдельно от того, где она вызывается).
Теперь, порядок нажатия справа налево не требует порядка оценки справа налево, но в ранних компиляторах памяти недостаточно. В порядке оценки справа налево тот же стек может использоваться на месте (по существу, после оценки аргумента - который может быть выражением или вызовом функции!) Возвращаемое значение уже находится в правильной позиции на стек). При оценке слева направо значения аргументов должны храниться отдельно и возвращаться в стек в обратном порядке.