Evaluación de la función printf () de decrementos pre y post en C

#include int main() { int i = 2; printf("\n %d %d %d \n",--i,i--,i); // 0 2 2 return 0; } 

La salida imprime 0 2 0 y no 0 2 2 No pude entender, ya que asumí que printf() evalúa de derecha a izquierda.

Su código exhibe un comportamiento no especificado . Según el documento estándar c99 , capítulo 6.5.2.2, párrafo 10:

El orden de evaluación del designador de la función, los argumentos reales y las subexpresiones dentro de los argumentos reales no está especificado, pero hay un punto de secuencia antes de la llamada real.

De nuevo, esto muestra un comportamiento indefinido , porque i se está modificando más de una vez entre dos puntos de secuencia. Según el capítulo 6.5 párrafo 2:

Entre el punto de secuencia anterior y el siguiente, un objeto tendrá su valor almacenado modificado a lo sumo una vez por la evaluación de una expresión. Además, el valor anterior se leerá solo para determinar el valor que se almacenará.

Printf no evalúa nada. Es el comstackdor que evalúa los argumentos de una función (es decir, el comstackdor que genera el código objeto) y el orden en el que se evaluarán los argumentos en C no está especificado. Así que el comstackdor puede evaluarlos en cualquier orden.