Стандарты ISO не гарантируют порядок, в котором будут оцениваться подвыражения.
Из чернового стандарта c ++ 0x:
1,9. Выполнение программы:
:
13 / Последовательность перед - это асимметричное, транзитивное, попарное отношение между оценками, выполняемыми одним потоком, которое вызывает частичный порядок среди этих оценок. При любых двух оценках A и B, если A секвенируется перед B, то выполнение A должно предшествовать выполнению B. Если A не секвенируется до B, а B не секвенируется перед A, то A и B не секвенируются. [Примечание: выполнение непоследовательного
оценки могут совпадать.]
Оценки A и B являются неопределенно упорядоченными, когда либо A упорядочивается перед B, либо B упорядочивается перед A, но не указано, какие именно. [Примечание: неопределенно последовательные оценки не могут перекрываться, но любой из них может быть выполнен первым.]
:
15 / Если не указано иное, вычисления операндов отдельных операторов и подвыражений отдельных выражений не являются последовательными.
При вызове функции (независимо от того, является ли функция встроенной), каждое вычисление значения и побочный эффект, связанный с любым выражением аргумента или с выражением постфикса, обозначающим вызываемую функцию, упорядочивается перед выполнением каждого выражения или оператора в теле вызываемая функция [Сноска: Другими словами, выполнение функций не чередуется друг с другом] . [Примечание: вычисления значений и побочные эффекты, связанные с различными выражениями аргументов, не являются последовательными.]
Каждая оценка в вызывающей функции (включая другие вызовы функций), которая иначе специально не упорядочена до или после выполнения тела вызываемой функции, определяется неопределенным образом по отношению к выполнению вызываемой функции.
Другими словами, реализация может свободно организовывать вызовы, используя любой метод, который пожелает. Однако вызовы функций обрабатываются специально согласно сноске - они не чередуются.