2011-07-08 26 views
5

Duplicar posible:
confused about printf() that contains prefix and postfix operators.printf usando la pila?

me encontré con un código con el siguiente fragmento,

int main() { 
    int c = 100; 
    printf("\n %d \t %d \n", c, c++); 
    return 0; 
} 

que la producción debería ser de 100 & 101 pero me da salida como

101  100 

¿Alguien podría ayudarme a saber por qué?

+0

Supongo que el código está evaluando los parámetros printf en orden inverso, por lo que la c del parámetro "C++" se inserta primero, luego se inserta el parámetro c anterior, que luego ya está incrementado. Si desea hacer 1 más c para el segundo valor, e incrementar también c, supongo que tendrá que usar printf ("\ n% d \ t% d \ n", c, c + 1); C++; –

Respuesta

-3

obras printf de derecha a izquierda por lo que primero ++ c se ejecuta (c = 100), entonces después de C++ ejecuta y C = 101 por lo tanto 101 y 100 es de salida http://en.wikipedia.org/wiki/Printf

+2

-1. Esto está mal. No puede haber expectativa de cuál es el resultado de invocar un comportamiento indefinido. –

+0

no es undefinef http://en.wikipedia.org/wiki/Printf leer wiki atleast ... por defecto printf está alineado a la derecha – ashmish2

+2

@ ashmish2: está confundiendo cómo printf procesa sus argumentos, y cómo los argumentos están "preparados" en el sitio de llamada antes de que se entreguen a printf. Esa segunda parte (orden de evaluación de los argumentos en una llamada a función) no está especificada por el estándar. – Mat

5

No hay garantía si c de la izquierda , o c++ a la derecha, se evaluará primero.

El orden de evaluación de los parámetros de función es Unspecifeid y por lo tanto comportamiento indefinido según el estándar.

Según Sección 1.9 de la C++ estándar:

"Ciertos otros aspectos y operaciones de la máquina abstracta se describen en esta Norma Internacional como unspecified (for example, order of evaluation of arguments to a function) Cuando sea posible, esta Norma Internacional. define un conjunto de comportamientos permitidos. Estos definen los aspectos no deterministas de la máquina abstracta ".

+0

Tiene un gran "Comportamiento no especificado" en negrita en su pregunta. Pero eso no es tan útil, porque como consecuencia el comportamiento no está definido. Por lo tanto, debe tener al menos un "comportamiento indefinido" más audaz. –

9

Los estándares C y C++ no garantizan el orden de evaluación de los parámetros de la función. La mayoría de los compiladores evaluarán los parámetros de derecha a izquierda porque ese es el orden en que se empujan en la pila usando la convención de llamadas cdecl.

+0

Hombre! Tienes que ser rápido aquí al responder estas preguntas "¿por qué mi programa hace " cuando es un comportamiento indefinido? –

+0

http://en.wikipedia.org/wiki/Printf no está indefinido – ashmish2

+0

@ ashmish2: El '' en el comentario de David Hammens no es 'printf' (que es una función bien definida) pero el' c, C++ 'argumentos. Eso no está definido. Consulte la Q anterior sobre este tema, http://stackoverflow.com/questions/3109475/confused-about-printf-that-contains-prefix-and-postfix-operators – MSalters

1

Si acaba de utilizar printf ("%d\n", c++) o printf ("%d\n", c), el resultado hubiera sido 100 en ambos casos. Imprimir c y C++ en una llamada de función como lo hizo es comportamiento indefinido.