¿Por qué devolver 0 es opcional?

4 minutos de lectura

avatar de usuario
De todos modos

¿Por qué si escribo

int main() 
{ 
    //... 
}

no necesito escribir return 0; al final de main ¿función? ¿El compilador lo hace por mí?

Yo uso GCC/C99.

  • Relacionado: stackoverflow.com/questions/204476/…

    – jball

    9 de noviembre de 2010 a las 21:12

  • Por lo general, querrá recordar sus declaraciones de devolución. Si solo escribe pequeños programas para usted, probablemente no tendrá problemas. Pero si escribe programas grandes o combina muchos diferentes, es bueno que las interfaces se comporten como se espera. Cuando un programa devuelve 0, significa que finalizó con éxito, otros valores indican error. Confiar en las funciones específicas del compilador/plataforma para mantener su código funcionando puede generar problemas.

    – Koebmand STO

    9 de enero de 2016 a las 1:18

avatar de usuario
Pete Kirkham

C99 y C++ caso especial el main función para devolver 0 si el control llega al final sin un retorno explícito. Esta solamente se aplica a la main función.

El bit relevante de la especificación C99 es 5.1.2.2.3 para el main caso especial

5.1.2.2.3 Terminación del programa

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; llegando al } que finaliza la función principal devuelve un valor de 0.

6.9.1/12

Si el } que finaliza una función, y el autor de la llamada utiliza el valor de la llamada de función, el comportamiento no está definido.

Puedes probar esto con gcc:

int foo ( void ) { }
int main( void ) { }

Modo C89 (errores para ambas funciones):

sandiego:$ gcc src/no_return.c -std=c89 -Wall 
src/no_return.c: In function ‘main’:
src/no_return.c:2: warning: control reaches end of non-void function
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function

Modo C99 (el principal es un caso especial):

sandiego:$ gcc src/no_return.c -std=c99 -Wall
src/no_return.c: In function ‘foo’:
src/no_return.c:1: warning: control reaches end of non-void function

avatar de usuario
Johannes Schaub – litb

Vuelve la C más reciente (actualmente es C99 con algunas modificaciones) 0 desde main por defecto si no hay declaración de retorno explícita al final de la función, y el control fluye fuera del final de la función (ver 5.1.2.2.3 en C99 TC3). Esto se debe a que la mayoría de las veces uno escribiría tal forma de devolución de todos modos.

En C89, debe devolver algo allí; no tiene tal retorno implícito. Pero no se requiere que el compilador diagnostique tal error (vea 3.6.6.4 en el Borrador C89 y 6.9.1/12 en C99 TC3).

  • Donde en el estándar C establece la función principal devuelve 0 de forma predeterminada si no hay una declaración de devolución explícita al final de la función principal solo dice esto alcanzar el } que finaliza la función principal devuelve un valor de 0. la condición si no hay una declaración de devolución explícita no aparece allí

    –Kevin

    26 de junio de 2021 a las 15:43


Si. main en C es una función muy especial que tiene algunas reglas adicionales. Ver el párrafo en el estándar C99 sobre su terminación a continuación. En esencia, dice que si sale de la función sin devolver un valor, esto es equivalente a si hubiera dado un valor de retorno de 0. esto es especial para mainhacerlo con otras funciones donde la función de llamada espera un valor de retorno podría (y lo hará) bloquear su programa.

Si el tipo de devolución de la función principal es un tipo compatible con int, una devolución desde 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 argumento; alcanzar el } que finaliza la función principal devuelve un valor de 0. Si el tipo de retorno no es compatible con int, el estado de terminación devuelto al entorno del host no se especifica.

Básicamente sí. No se requiere que las funciones devuelvan nada, incluso si declaran un tipo de retorno que no sea void. El valor devuelto será indefinido.

Tenga en cuenta que C99 requiere que las funciones que declaran novoid los tipos de devolución siempre terminan al presionar una declaración de devolución. Entonces, si estuviera compilando usando el modo C99 de su compilador, este código generaría un error en tiempo de compilación.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad