c - why - wp_nav_menu example
¿Por qué main no devuelve 0 aquí? (3)
Solo estaba leyendo
ISO / IEC 9899: Borrador del Comité 201x - 12 de abril de 2011
en el que encontré en 5.1.2.2.3 Terminación del programa
..reaching the } that terminates the main function returns a value of 0.
significa que si no especifica ninguna declaración de devolución en main()
, y si el programa se ejecuta con éxito, entonces en el corchete de cierre} de main devolverá 0.
Pero en el siguiente código no especifico ninguna declaración de retorno, sin embargo, no devuelve 0
#include<stdio.h>
int sum(int a,int b)
{
return (a + b);
}
int main()
{
int a=10;
int b=5;
int ans;
ans=sum(a,b);
printf("sum is %d",ans);
}
compilar
gcc test.c
./a.out
sum is 15
echo $?
9 // here it should be 0 but it shows 9 why?
Devuelve el valor de retorno de printf
que es el número de caracteres realmente impresos.
El valor de retorno de una función normalmente se almacena en el registro eax de la CPU, por lo que la declaración "return 4;" por lo general se compila a
mov eax, 4;
ret;
y return x (dependiendo de tu compilador) sería algo así como:
mov eax, [ebp + 4];
ret;
si no especifica un valor de retorno, el compilador todavía escupirá el "ret" pero no cambia el valor de eax. Entonces la persona que llama pensará que lo que quedó en el registro eax anteriormente es el valor de retorno. Para este ejemplo, normalmente sería el valor de retorno printf, pero diferentes compiladores generarán diferentes códigos de máquina y usarán algunos registros de manera diferente.
Esta es una explicación simplificada, las diferentes convenciones de llamadas y las plataformas de destino jugarán un papel vital, pero debería ser suficiente información para explicar lo que está sucediendo "detrás de escena" en su ejemplo.
Si tiene una comprensión básica del ensamblador, vale la pena comparar el desmontaje de diferentes compiladores. Puede encontrar que algunos compiladores están borrando el registro eax como salvaguarda.
Esa regla fue agregada en la versión 1999 del estándar C. En C90, el estado devuelto no está definido.
Puede habilitarlo pasando -std=c99
a gcc.
Como nota al margen, curiosamente se devuelve 9 porque es el retorno de printf
que acaba de escribir 9 caracteres.