Las normas ISO no garantizan el orden en que se evaluarán las subexpresiones.
Desde el ++ 0x proyecto de norma c:
1,9. Ejecución del programa:
:
13/ Secuenciado antes es un transitivo, relación asimétrica, por pares entre las evaluaciones ejecutadas por un solo hilo, que induce un orden parcial entre dichas evaluaciones. Dadas dos evaluaciones A y B, si A se secuencia antes de B, entonces la ejecución de A debe preceder a la ejecución de B. Si A no se secuencia antes de que B y B no se secuencian antes de A, entonces A y B no se siguen. [Nota: La ejecución de evaluaciones no secuenciadas de puede solaparse.]
Las evaluaciones A y B se secuencian de forma indeterminada cuando A se secuencia antes de que B o B se secuencian antes que A, pero no se especifica qué. [Nota: Las evaluaciones indeterminadamente secuenciados no pueden superponerse, pero o bien podrían ser ejecutados en primer lugar.]
:
15/ Excepto donde se indique, las evaluaciones de los operandos de los operadores individuales y de subexpresiones de expresiones individuales se no secuenciado
:
Cuando se llama a una función (si o no la función es en línea), cada efecto del valor de cálculo y secundarios asociados con cualquier expresión argumento, o con la expresión de sufijo que designa la función llamada, se secuenciaron antes de la ejecución de cada expresión o declaración en el cuerpo de la función llamada [Nota al pie: en otras palabras, las ejecuciones de funciones no se entrelazan entre sí]. [Nota: los cómputos de valor y los efectos secundarios asociados con diferentes expresiones de argumentos no se han secuenciado.]
Cada evaluación en la función de llamada (incluidas otras llamadas a funciones) que no está secuenciada específicamente antes o después de la ejecución del cuerpo del llamado la función está indeterminadamente secuenciada con respecto a la ejecución de la función llamada.
En otras palabras, la implementación es libre de organizar las llamadas utilizando el método que desee. Sin embargo, las llamadas a funciones se tratan especialmente según la nota al pie: hacen y no entrelazado.
Presumiblemente tiene un error tipográfico en el código allí ... Veo dos declaraciones 'function1'. – dmckee
¡Esto no compilaría le falta la segunda función! Cambie el nombre de la segunda función a function2(). – Secko
@dmckee corrigió el error de tipeo. – Raghvan