2010-02-12 9 views
27

Devo tornare al livello precedente della ricorsione. è la sintassi come in basso a destra?Posso tornare in funzione nulla?

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

hai provato a compilare? –

+14

@Mitch: per quanto ragionevole, dimostra solo che _your_ compiler lo supporta, non se è effettivamente C++ valido. Per esempio. Posso facilmente "provare" che "void main()" è corretto in questo modo. – MSalters

risposta

57

Sì, puoi tornare da una funzione di annullamento.

È interessante notare che è possibile restituire un annullamento da una funzione di annullamento. Ad esempio:

void foo() 
{ 
    return void(); 
} 

Come previsto, questo è lo stesso di un normale return;. Può sembrare esoterico, ma il motivo è la coerenza del modello:

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

Qui, default_value restituisce un oggetto default-costruito di tipo T, e per la capacità di ritornare void, funziona anche quando T = void.

+0

è la stessa cosa se nell'istruzione di ritorno, si chiama una funzione, che restituisce un vuoto? per esempio. return f(); dove il prototipo di f è void f(); – Goaler444

+0

oh aspetta, quindi questo costruttore ha la firma void (void)? Quindi 'return void (void())' è valido anche. Sfida l'offuscamento del codice a chiunque? –

10

Sicuro. Non dovresti restituire un valore reale.

3

Sì, è possibile utilizzare tale codice per tornare dalla funzione. (Devo essere molto prolisso qui per rendere Stack Overflow non dire che la mia risposta è troppo breve)

+0

Nah, sono solo 15 caratteri. Fidati di me, ci corro dentro * tutto * il tempo ... –

+1

IIRC hai usato per essere in grado di riempirlo con spazi :-) – xyz

+0

Puoi usare i puntini di sospensione per estrarre alcuni caratteri, e '(15)' ti dà ancora di più mentre è chiaro che lo stai facendo solo per il padding. –

2

Non dovresti avere il ritorno lì, il programma tornerà alla funzione precedente da solo, andare in debug modalità e passaggio e puoi vederlo da solo. D'altra parte non penso che avere un ritorno ci danneggerà del tutto il programma.

+0

Sì, sei corretto. Anche se senza sapere a cosa si riferisce il codice qui riportato, può essere sensato essere esplicito.Sebbene il ritorno subito prima della parentesi di chiusura sia estraneo. – Casey

4

Sì, che tornerà dalla funzione al livello precedente di ricorsione. Questa sarà una spiegazione molto semplice, ma quando chiami una funzione stai creando un nuovo stack di chiamate. In una funzione ricorsiva si sta semplicemente aggiungendo a tale stack di chiamate. Tornando da una funzione, indipendentemente dal fatto che si restituisca o meno un valore, si sposta nuovamente il puntatore dello stack sulla funzione precedente nello stack. È un po 'come una pila di piatti. Continui a mettere delle piastre su di esso, ma piuttosto che tornare muove il piatto superiore.

È inoltre possibile verificare questo utilizzando un debugger. Basta inserire alcuni punti di interruzione nel codice e attraversarlo. Puoi verificare che funzioni.

+1

Cornice dello stack. I nuovi thread ottengono nuovi stack, le chiamate di funzione ottengono nuovi frame di stack sullo stesso stack in un determinato thread. Voglio solo chiarire quel dettaglio perché potrebbe confondere i nuovi arrivati. – stu

2

La semplice risposta a questo è SÌ! C++ riconosce il metodo void come una funzione senza restituzione. Fondamentalmente dice al compilatore che qualunque cosa accada, una volta che vedi l'interruzione return; e lasci il metodo ....

2

Come tutti gli altri hanno detto, sì è possibile. In questo esempio, il reso non è necessario e serve in modo discutibile uno scopo. Penso che quello a cui ti riferisci sia un ritorno anticipato nel bel mezzo di una funzione. Puoi farlo anche se è una cattiva pratica di programmazione perché porta a un flusso di controllo complicato (non single-entry single-exit), insieme a dichiarazioni come break. Invece, salta il resto della funzione usando condizionali come if/else().

Problemi correlati