Respondiendo porque todas las respuestas existentes dicen que es un comportamiento indefinido, lo cual no es cierto, entonces no tengo nada Yo c un voto popular.
En C89 (gracias a PMG En referencia a una draft standard), 5.1.2.2.3:
Un retorno de la llamada inicial a la función principal es equivalente a llamar a la función de salida con el valor devuelto por la función principal como su argumento. Si el} que termina la función principal se alcanza, el estado de terminación devuelto al entorno del host es no especificado.
En C99, citando de n1256, 5.1.2.2.3:
Si el tipo de retorno de la función principal es un tipo compatible con int, un retorno de la llamada inicial a la función principal es equivalente a llamar a la función de salida con el valor devuelto por la función principal como su argumento; al llegar a} que finaliza la función principal devuelve un valor de de 0. Si el tipo de devolución no es compatible con int, el estado de terminación devuelto al entorno de host no está especificado.
Por lo tanto, no es "un comportamiento indefinido": se comporta como si los main
devuelve la función, pero en C89 el valor devuelto no está especificado por la norma. Para su programa de ejemplo, en su implementación, el valor devuelto parece ser consistentemente de 12, presumiblemente por el motivo que dice Ben Voigt. Como estás en Linux, probablemente no sea un gran cambio compilar tu código como C99 (o de todos modos, compilarlo usando el modo C99 casi compatible con gcc).
Para cualquier función que devuelve un valor, que no sea main
, que es un comportamiento indefinido, a menos la persona que llama no utiliza el valor de retorno (n1256, 6.9.1/12):
Si el} que termina una función es alcanzado, y el valor de la función es utilizado por la persona que llama, el comportamiento no está definido.
No estoy seguro de si la llamada inicial a main
se debe mencionar como excluida de esta regla general. No necesita ser: desde el punto de vista del estándar, esa llamada no tiene una persona que llama, por lo que creo que el valor de la llamada a la función no es "utilizado por la persona que llama", aunque se convierta en el estado de finalización para el programa
+1 buena pregunta. :) – Pavitar
http://stackoverflow.com/questions/204476/what-should-main-return-in-c-- y-c –