Los estándares C99 y C ++ no requieren funciones para devolver un valor. La declaración de retorno faltante en una función de retorno de valor se definirá (para devolver 0
) solo en la main
función.
La lógica incluye que verificar si cada ruta de código devuelve un valor es bastante difícil, y un valor de retorno podría establecerse con un ensamblador incorporado u otros métodos complicados.
Del borrador de C ++ 11 :
§ 6.6.3 / 2
Salir del final de una función [...] da como resultado un comportamiento indefinido en una función de retorno de valor.
§ 3.6.1 / 5
Si el control llega al final de main
sin encontrar una return
declaración, el efecto es el de ejecutar
return 0;
Tenga en cuenta que el comportamiento descrito en C ++ 6.6.3 / 2 no es el mismo en C.
gcc le dará una advertencia si lo llama con la opción -Wreturn-type.
-Wreturn-type Avisa siempre que una función se define con un tipo de retorno que por defecto es int. También advierta sobre cualquier declaración de retorno sin valor de retorno en una función cuyo tipo de retorno no es nulo (se considera que la devolución del extremo del cuerpo de la función devuelve sin un valor), y sobre una declaración de retorno con una expresión en una función cuyo return-type es nulo.
Esta advertencia está habilitada por -Wall .
Solo como curiosidad, mira lo que hace este código:
#include <iostream>
int foo() {
int a = 5;
int b = a + 1;
}
int main() { std::cout << foo() << std::endl; } // may print 6
Este código tiene un comportamiento formalmente indefinido y, en la práctica, llama a convenciones y depende de la arquitectura . En un sistema particular, con un compilador particular, el valor de retorno es el resultado de la última evaluación de expresión, almacenada en el eax
registro del procesador de ese sistema.