2010-02-12 11 views
27

Ich muss auf die vorherige Ebene der Rekursion zurückkehren. ist die Syntax wie unten rechts?Kann ich in der Leerfunktion zurückkehren?

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

hast du versucht, kompilieren? –

+14

@Mitch: Angemessen, wie das ist, es beweist nur, dass _your_ Compiler unterstützt, nicht, ob es tatsächlich gültige C++. Z.B. Ich kann leicht "beweisen", dass 'void main()' auf diese Weise korrekt ist. – MSalters

Antwort

57

Ja, Sie können von einer Void-Funktion zurückkehren.

Interessanterweise können Sie auch Void von einer Void-Funktion zurückgeben. Zum Beispiel:

void foo() 
{ 
    return void(); 
} 

Wie erwartet, ist dies das gleiche wie eine reines return;. Es mag esoterisch erscheinen, aber der Grund ist für eine Vorlage Konsistenz:

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

Hier default_value gibt ein default-konstruiertes Objekt vom Typ T, und wegen der Fähigkeit void zurückzukehren, es funktioniert auch, wenn T = void.

+0

ist es die gleiche Sache, wenn Sie in der Rückgabeanweisung eine Funktion aufrufen, die eine Lücke zurückgibt? z.B. Rückgabe f(); wo der Prototyp von f leer ist f(); – Goaler444

+0

oh warte, also hat dieser Konstruktor eine void (void) Signatur? So ist 'return void (void())' auch gültig. Code Verschleierung Wettbewerb jemand? –

10

Sicher. Sie sollten nur keinen tatsächlichen Wert zurückgeben.

3

Ja, Sie können diesen Code verwenden, um von der Funktion zurückzukehren. (Ich muss hier sehr ausführlich sein, damit Stack Overflow nicht sagt, dass meine Antwort zu kurz ist)

+0

Nein, es ist nur 15 Zeichen. Vertrauen Sie mir, ich in sie laufen * alle * die Zeit ... –

+1

IIRC verwendet man mit Leerzeichen aufzufüllen es in der Lage sein :-) – xyz

+0

Sie Ellipsen zu polstern ein paar Zeichen verwenden können, und '(15)' gibt Ihnen noch mehr, während Sie klarstellen, dass Sie es nur für die Polsterung tun. –

2

Sie sollten dort nicht zurückkommen müssen, das Programm kehrt zur vorherigen Funktion selbst zurück, geht in debug Modus und Schritt durch und Sie können es selbst sehen. Auf der anderen Seite glaube ich nicht, dass eine Rückkehr dort das Programm beschädigen wird.

+0

Ja, Sie haben Recht. Obwohl, ohne zu wissen, was der hier angegebene Code ist, kann es sinnvoll sein, explizit zu sein.Obwohl die Rückkehr kurz vor der schließenden Klammer fremd ist. – Casey

4

Ja, das wird von der Funktion auf die vorherige Rekursionsebene zurückkehren. Dies wird eine sehr einfache Erklärung sein, aber wenn Sie eine Funktion aufrufen, erstellen Sie einen neuen Aufruf-Stack. In einer rekursiven Funktion fügen Sie einfach diesen Call-Stack hinzu. Wenn Sie von einer Funktion zurückkehren, ob Sie einen Wert zurückgeben oder nicht, verschieben Sie den Stapelzeiger zurück zur vorherigen Funktion im Stapel. Es ist wie ein Stapel Platten. Du legst immer Teller darauf, aber wenn du zurückkommst, bewegt sich die obere Platte.

Sie können dies auch mithilfe eines Debuggers überprüfen. Fügen Sie einfach einige Breakpoints in Ihren Code ein und durchlaufen Sie sie. Sie können selbst überprüfen, ob es funktioniert.

+1

Stapelrahmen. Neue Threads erhalten neue Stacks, Funktionsaufrufe erhalten neue Stack-Frames auf demselben Stack in einem bestimmten Thread. Ich will nur dieses Detail klären, weil es Newcomer verwirren könnte. – stu

2

Die einfache Antwort darauf ist JA! C++ erkennt die void-Methode als Funktion ohne Rückgabe. Es teilt dem Compiler grundsätzlich mit, dass, was auch immer passiert, sobald Sie die return; Pause sehen und die Methode verlassen ....

2

Wie alle anderen auch gesagt haben, ja du kannst. In diesem Beispiel ist eine Rückgabe nicht notwendig und dient in fraglicher Weise einem Zweck. Ich denke, was Sie meinen, ist eine frühe Rückkehr mitten in einer Funktion. Sie können aber auch das tun es schlechter Programmier ist, weil es zu kompliziert Steuerfluss führt (nicht einströmige Single-Ausgang), zusammen mit Anweisungen wie Pause. Überspringen Sie stattdessen einfach den Rest der Funktion mit Bedingungen wie if/else().

Verwandte Themen