Cosas de los compiladores…
¿Cuál sería el comportamiento esperado de éste código?
int main () {
int i = 0;
printf("%d %d %d", i++, i++,i++);
}
Yo, dentro de mi ignorancia, esperaba algo como: 0 1 2
pero…. cual fue mi sorpresa cuando veo… :
$ ./prueba1
2 1 0
Si, es flipante. No se evalúa de izquierda a derecha, sino de derecha a izquierda. ¿Por qué?
¡¡ Pues porque eso es otra de las cosas no definidas en el estándar de C !! El orden de evaluación de los argumentos se deja a elección del compilador, así que no se puede garantizar cual de ellos se va a calcular primero. No necesariamente tiene que ver con el orden en que se inserten en la pila, aunque en este caso coincide. (En c, los parámetros se ponen en la pila desde el último al primero)
Por ejemplo, en gcc 4.1 sobre un x86_64, la salida es 2 1 0, pero en un itanium 64 con el compilador icc de intel…
$ ./prueba1
0 1 2
¿Y que hacemos los pobres programadores ante semejante locura?
Pues, lo único posible es evitar usar código en el que los parámetros se evalúen en la misma llamada, porque aunque en nuestra máquina de pruebas funcione, es posible que al llevarlo a otra deje de funcionar, aún con el mismo compilador! ya que incluso pasa con versiones diferentes del mismo…
En fin.. suerte!