Порядок вычисления следующих трех подвыражений не указан:
f(10)
f(f(10))
f(f(f(10)))
Компилятор может оценивать эти подвыражения в любом порядке. Вам не следует полагаться на определенный порядок оценки в вашей программе, особенно если вы собираетесь компилировать с использованием нескольких компиляторов.
Это потому, что в этом выражении нет ни одной точки последовательности. Единственное требование состоит в том, чтобы каждое из этих подвыражений оценивалось до того, как потребуется результат (то есть до того, как результат должен быть напечатан).
В вашем примере, на самом деле есть несколько подвыражений, которые я пометил здесь как сквозные:
// a b c d e f g h i j k
cout << f(10) << ", " << f(f(10)) << ", " << f(f(f(10)));
Вызовы operator<<
(a
, c
, d
, g
и h
) должны быть оценены по порядку, так как каждый зависит от результата предыдущего вызова. Аналогично, b
должен быть оценен до того, как a
может быть оценен, и k
должен быть оценен до того, как j
, i
или h
могут быть оценены.
Однако между некоторыми из этих подвыражений нет никакой зависимости: результат b
не зависит от результата k
, поэтому компилятор может генерировать код, который оценивает k
затем b
или b
, затем k
.
Для получения дополнительной информации о точках последовательности и связанных с ними неопределенных и неопределенных режимах рассмотрите статью часто задаваемых вопросов о переполнении стека C ++, «Неопределенные точки поведения и точки последовательности» (ваша программа не имеет неопределенного поведения, но большая часть статьи все еще применяется).