2010-02-12 14 views
27

Tengo que regresar al nivel anterior de la recursión. es la sintaxis como abajo a la derecha?¿Puedo regresar en la función de vacío?

void f() 
{ 
    // some code here 
    // 
    return; 
} 
+23

¿Ha intentado compilar? –

+14

@Mitch: Por razonable que sea, solo prueba que _your_ compilador lo admite, no si es realmente válido C++. P.ej. Puedo "probar" fácilmente que 'void main()' es correcto de esa manera. – MSalters

Respuesta

57

Sí, puede devolver desde una función vacía.

Curiosamente, también puede devolver el vacío de una función de vacío. Por ejemplo:

void foo() 
{ 
    return void(); 
} 

Como era de esperar, esta es la misma que una llanura return;. Puede parecer esotérico, pero la razón es para mantener la coherencia de plantilla:

template<class T> 
T default_value() 
{ 
    return T(); 
} 

Aquí default_value, devuelve un objeto predeterminado-construida de tipo T, y debido a la capacidad de volver void, funciona incluso cuando T = void.

+0

¿Es lo mismo si en la instrucción de retorno, llama a una función, que devuelve un vacío? p.ej. return f(); donde el prototipo de f es nulo f(); – Goaler444

+0

oh espera, ¿entonces este constructor tiene una firma vacía (nula)? Entonces 'return void (void())' también es válido. Concurso de ofuscación de código a nadie? –

10

Sure. No deberías devolver un valor real.

3

Sí, puede usar ese código para regresar de la función. (Tengo que ser muy detallado aquí para hacer que Stack Overflow no diga que mi respuesta es demasiado corta)

+0

Nah, solo tiene 15 caracteres. Confía en mí, me encuentro con él * todo * el tiempo ... –

+1

IIRC que solía ser capaz de rellenarlo con espacios :-) – xyz

+0

Puede usar puntos suspensivos para rellenar algunos caracteres, y '(15)' le da aún más, dejando en claro que lo está haciendo solo para el relleno. –

2

No debería tener que tener la devolución allí, el programa volverá a la función anterior por sí mismo, vaya a la depuración modo y paso y puedes verlo tú mismo. Por otro lado, no creo que tener un retorno pueda dañar el programa.

+0

Sí, estás en lo correcto. Aunque sin saber a qué se refiere el código aquí, puede tener sentido ser explícito.Aunque el regreso justo antes del corsé de cierre es extraño. – Casey

4

Sí, eso regresará de la función al nivel previo de recursión. Esta va a ser una explicación muy básica, pero cuando llamas a una función estás creando una nueva pila de llamadas. En una función recursiva, simplemente está agregando a esa pila de llamadas. Al regresar de una función, ya sea que devuelva un valor o no, está moviendo el puntero de la pila a la función anterior en la pila. Es como una pila de platos. Sigues colocando placas, pero al volver mueve la placa superior.

También puede verificar esto utilizando un depurador. Simplemente ponga algunos puntos de interrupción en su código y páselo. Puedes verificar que funciona.

+1

Marco de la pila. Los nuevos hilos obtienen nuevas pilas, las llamadas de función obtienen nuevos marcos de pila en la misma pila en un hilo determinado. Solo quiero aclarar ese detalle porque podría confundir a los recién llegados. – stu

2

¡La respuesta simple a esto es SÍ! C++ reconoce el método nulo como una función sin retorno. Básicamente, le dice al compilador que pase lo que pase, una vez que vea el return;, interrumpa y deje el método ....

2

Como todos los demás dijeron, sí se puede. En este ejemplo, el retorno no es necesario y cuestionable sirve un propósito. Creo que a lo que se refiere es a un regreso temprano en el medio de una función. También puedes hacerlo, pero es una mala práctica de programación porque lleva a un complicado flujo de control (no a una entrada única de salida única), junto con sentencias como break. En su lugar, omita el resto de la función usando condicionales como if/else().

Cuestiones relacionadas