Orden de evaluación
El orden de evaluación de cualquier parte de cualquier expresión, incluyendo el orden de evaluación de los argumentos de función está no especificado (con algunas excepciones como se lista abajo). El compilador puede evaluar los operandos y otras subexpresiones en cualquier orden, y puede escoger otro orden cuando la misma expresión se evalúa de nuevo.
No existe un concepto de evaluación de izquierda a derecha o de derecha a izquierda en C++. Esto no debe confundirse con la asociatividad de los operadores de izquierda a derecha y de derecha a izquierda: la expresión a() + b() + c() se analiza como (a() + b()) + c() debido a la asociatividad de izquierda a derecha del operador +, pero la llamada de función a c puede evaluarse primero, al último, o entre a() o b() en tiempo de ejecución:
#include <cstdio>
int a() { return std::puts("a"); }
int b() { return std::puts("b"); }
int c() { return std::puts("c"); }
void z(int, int, int) {}
int main() {
z(a(), b(), c()); // todas las 6 permutaciones de salida se permiten
return a() + b() + c(); // todas las 6 permutaciones de salida se permiten
}
Posible salida:
b
c
a
c
a
b