2010-02-23 11 views
6

posibles duplicados:
printf(“%d %d %d\n”,++a, a++,a) output problem
Parameter evaluation order before a function calling in Cprintf y ++ operador

#include<stdio.h> 
main() 
{ 
    int a=10; 
    printf("\n %d %d", a, a++); //11 10 
    a=10; 
    printf("\n %d %d", a++, a); //10 11 
    a=10; 
    printf("\n %d %d %d ", a, a++,++a); //12 11 12 
} 

después de ejecutar este me dio la salida dada en los comentarios. por lo que sé, la primera salida se espera porque la ejecución de printf va de derecha a izquierda pero no pudo entender el segundo y el tercero

+0

duplicado: http://stackoverflow.com/questions/1270370/printfd-ddnaaa-output-problem – Vladimir

+0

+1 para una buena pregunta .. No sabía que funcionó de esa manera – Earlz

+0

El cálculo de los argumentos para * printf * no es parte de la ejecución de * printf *. Todos los argumentos deben calcularse antes de que * printf * comience a ejecutarse. –

Respuesta

3

Ninguno de los resultados realmente puede calificar como inesperado. Todos los argumentos para una función se evalúan antes de ingresar a la función en sí, pero el orden de su evaluación relativo entre sí no está especificado, por lo que se permiten todos estos resultados. Oficialmente, su último (que tiene dos instancias separadas de incremento a) tiene un comportamiento indefinido, por lo que no tiene que hacer nada sensato en absoluto.

+0

Si hay un punto de secuencia entre la evaluación de cada argumento, ¿por qué el último en particular debería estar más equivocado que los demás? – UncleBens

+0

El último es "más erróneo" porque modifica 'a' dos veces sin un punto de secuencia intermedio. El resto solo modifica 'a' una vez. –

+0

@UncleBens: no hay un punto de secuencia entre la evaluación de cada argumento. Hay una llamada de secuencia después de que los operandos hayan sido evaluados y antes de que se llame a la función, pero no hay puntos de secuencia (en el ejemplo) mientras se están evaluando los argumentos. –

3

está invocando un comportamiento indefinido haciendo referencia tanto 'a' y 'A ++' en la lista de argumentos.

No se define en qué orden se evalúan los argumentos. Diferentes compiladores pueden elegir diferentes órdenes. Un único compilador puede elegir diferentes pedidos en diferentes momentos.

¡No lo hagás!

8

Nada va "de derecha a izquierda" en la evaluación del argumento de la función. Cuando se evalúan los argumentos de función, el orden de evaluación no se especifica y no hay puntos de secuencia entre la evaluación de argumentos por separado. Esto significa que no hay absolutamente ningún orden temporal en este proceso. Los argumentos se pueden evaluar en cualquier orden, y el proceso de su evaluación se puede entrelazar de cualquier manera.

Sin embargo, su código presenta problemas aún peores. Las tres instrucciones que llaman al printf producen un comportamiento indefinido (UB) porque intentan modificar el mismo objeto (a) dos veces sin un punto de secuencia entre las modificaciones (la tercera llamada) o intentan modificar un objeto y leerlo para un propósito independiente (la primera y la segunda llamada). Por lo tanto, es demasiado pronto para mencionar siquiera el orden de la evaluación. El comportamiento de tu código no está definido.

0

++ a significa incrementar primero, y luego volver a evaluar la expresión. (a changes, y la expresión se evalúa como a + 1)

a ++ significa evaluar a (entonces, erm, a), y luego incrementarlo. Entonces, se pasa a, pero el valor de a es entonces (es decir, después) cambiado a a + 1.

+0

Aunque las otras personas que dicen que no hay un orden de evaluación establecido también son correctas, acabo de tratar de explicar los operadores de prefijo y postfijo ... –