valores usar sentencia retorno retornan que programacion funciones funcion ejemplo como c++

usar - ¿Es obligatoria una declaración de devolución para las funciones de C++ que no se devuelven nulas?



valores de retorno en programacion (7)

El libro de My Herb Schildt en C ++ dice: "... En C ++, si se declara que una función devuelve un valor, debe devolver un valor". Sin embargo, si escribo una función con un tipo de retorno no vacío y no devuelvo nada, el compilador emite una advertencia en lugar de un error: "El control llega al final de la función de no vacío".

Yo uso gcc (MinGW) y he establecido la marca -pedántica.


¿Es obligatorio? No lo creo, sin embargo, no devolver un valor en una función de devolución no vacía no está definido según mi entendimiento de los estándares de c ++ (excepto main, que devuelve 0).

¿Eso significa que está bien? Probablemente no: si se supone que la función devuelve un valor, deberías devolver uno, que podría resultar muy complicado en las bases de código complejas.


§6.6.3 / 2:

Fluir fuera del final de una función es equivalente a un retorno sin valor; esto resulta en un comportamiento indefinido en una función de retorno de valor.

Así que depende de tu definición de obligatorio. Tienes que No. Pero si quieres que tu programa tenga un comportamiento bien definido, sí. *

* main es una excepción, ver §3.6.1 / 5. Si el control llega al final de main sin return , tendrá el efecto de return 0; .


Como dijo el GMan, la única excepción es la función principal. Todavía veo toneladas de libros que devuelven 0 en la pantalla principal, lo cual no es realmente necesario. Oh, bueno, creo que podría ser peor y podrías estar aprendiendo de un libro que usa void main () en lugar de int main (). Pero creo que lo que debería aprender de todo esto es que su compilador se queja por una razón y es bueno que lo haya tomado ya que, por lo general, le ahorrará dolores de cabeza a largo plazo.


Es obligatorio: es un comportamiento indefinido cuando dicha función termina sin devolver nada (por lo que los compiladores podrían implementar algún tipo de comportamiento especial). Sin embargo, hay algunos casos especiales.

::main es una excepción, se supone que return 0; Está al final de su código.

Además, no tiene que devolver un valor en una función que no se devuelve limpiamente, fe:

int Foo() { throw 42; }


No es obligatorio tener una declaración de retorno en una función declarada como que devuelve non-void y no tiene que llevar a un comportamiento indefinido.

Tal función podría:

  • No volverá, digamos ingresando un bucle infinito.
  • Volver lanzando una excepción.
  • Llama a una función que no vuelve, como std::terminate

Por supuesto, si una función evita el comportamiento indefinido al hacer siempre uno de los anteriores, probablemente no debería declararse como no devuelto si es posible.

Un caso obvio en el que lo necesitaría es si se trata de una función virtual que para un punto en particular en una jerarquía de clases no puede devolver un valor válido y siempre sale a través de una excepción.


Olvidarse de incluir una declaración de return en alguna ruta de control de una función de retorno de valor no hace que su código esté mal formado. Es decir, normalmente debe esperar que el código se compile (tal vez con una advertencia). En ese sentido no es "obligatorio".

Sin embargo, el hecho de que la función de retorno de valor en C ++ finalice siempre es un comportamiento indefinido. (En C, el comportamiento es indefinido solo si el código que llama realmente usa el resultado).


Sí, debe devolver un valor.

Fluir fuera del final de una función es equivalente a un retorno sin valor; esto resulta en un comportamiento indefinido en una función de retorno de valor.

Esta pregunta traerá más luz al tema.