Wie brechen Sie aus einer Funktion?

8

Ist eine Funktion, die einen Wert zurückgibt, möglich, die Funktion unter einer bestimmten Bedingung zu verlassen, ohne etwas zurückzugeben? Wenn ja, wie können Sie das erreichen?

Beispiel:

%Vor%

Also sagen Sie, Sie sind in dieser Funktion. Gibt es eine Möglichkeit, es zu verlassen, ohne etwas zu tun?

    
Brandon 17.02.2010, 07:37
quelle

13 Antworten

15

Sie haben zwei Optionen: return something oder throw .

%Vor%

Wenn du throw hast, musst du catch den Typ, den du geworfen hast.

%Vor%     
rerun 17.02.2010, 07:41
quelle
16

Sie könnten mit einem return; ohne Rückgabewert davonkommen. Der Compiler wird warnen, aber möglicherweise keinen Fehler.

ABER Warum in aller Welt würdest du darüber nachdenken? Was versuchst du zu erreichen?

Und wie sieht der Anrufcode aus? Wenn es int someVar = getNumber(); ist, ist der Wert von someVar nicht definiert (was A Bad Thing ist).

Es klingt für mich so, als würden Sie zwei Informationen zurückgeben, von denen eine Ihnen sagt, ob die andere gültig ist.

Versuchen Sie etwas wie

%Vor%     
Mawg 17.02.2010 07:46
quelle
8

Einfache Lösung:

%Vor%     
MSalters 17.02.2010 09:04
quelle
3

Für float und double gibt es eine Alternative, aber nicht für int Typen.

%Vor%

Seien Sie vorsichtig, wenn Sie NaN verwenden. Jede Bedingung von val wird wahr sein.

    
Totonga 17.02.2010 08:07
quelle
3

Machen Sie es zu einer Voraussetzung für den Benutzer, zuerst zu überprüfen, dass die Warteschlange nicht leer ist (dafür sorgen).

Dann können Sie:

  • überprüfe nichts und rufe einfach undefiniertes Verhalten auf (greife auf die zugrunde liegenden Daten zu, als ob sie dort wären) - es ist die Schuld des Benutzers
  • check and throw Ausnahme
  • assert (Ergebnis ist mit NDEBUG nicht definiert)

Das Überprüfen und anschließende Aufrufen von undefiniertem Verhalten (das Zurückgeben eines willkürlichen Wertes) ist das Schlimmste, was zu tun ist. Sie erhalten sowohl den Laufzeit-Overhead des Checks als auch den Aufrufer nicht weiser, da das Ergebnis immer noch undefiniert ist.

    
visitor 17.02.2010 11:17
quelle
2

Alternative von Ausnahmen ist Rückgabe des Statuscodes:

%Vor%     
zabulus 17.02.2010 07:55
quelle
1

Sie könnten eine bestimmte Ausnahme auslösen und sie entsprechend abfangen.

    
Simon Linder 17.02.2010 07:41
quelle
1

Sie können auch eine Klasse / Struktur mit einer magischen Umwandlung zurückgeben, die für Ihre speziellen Bedürfnisse nützlich ist.

Beispiel aus der Praxis: Einmal musste ich tatsächlich zwei Informationen im selben Rückgabewert zurückgeben, einen Wert, der gemeldet wurde, wenn eine Nachricht vollständig verarbeitet wurde, und den Wert, der zurückgegeben werden musste, wenn die Verarbeitung bereits abgeschlossen war . Also habe ich alles in so einer Klasse verpackt:

%Vor%

Dies erlaubte mir, return false; in einer Funktion zu verwenden, die einen MessageReturnValue zurückgab, wenn die Nachricht noch verarbeitet werden musste, oder in return TRUE/15/whatever; , wenn die Nachricht vollständig verarbeitet worden war und ich bereits einen Rückgabewert hatte. Der Anrufer konnte auf der Seite einfach

tun %Vor%

Wenn Sie komplexere Anforderungen haben, können Sie auch boost :: tuple verwenden.

    
Matteo Italia 17.02.2010 08:31
quelle
0

In C ++ muss eine Funktion einen Wert (Werttyp, Referenz oder Adresse) zurückgeben, wenn in der Funktionsdeklaration / -definition ein Wert angegeben ist.

    
xgalaxy 17.02.2010 07:40
quelle
0

Sie könnten eine Ausnahme auslösen. Sie würden nichts zurückgeben, aber Sie müssen die Ausnahme abfangen, um zu bestimmen, was als nächstes zu tun ist (Sie könnten die Ausnahme immer schlucken und nichts tun, um zu erreichen, was Sie wollen).

    
Jeff Foster 17.02.2010 07:41
quelle
0

Ein Redesign Ihrer Methode ist wahrscheinlich in der richtigen Reihenfolge, wenn Sie aus einer Funktion ausbrechen müssen, die einen Wert zurückgeben soll ... oder Sie könnten einfach einen "Fehler" -Wert irgendeiner Art zurückgeben.

    
Xorlev 17.02.2010 07:41
quelle
0

Was ist Ihr tatsächlicher Anwendungsfall?

Wenn Sie wirklich nichts zurückgeben und die Ausführung der normalen Funktion beenden müssen, können Sie eine Ausnahme auslösen .

Sie können auch etwas zurückgeben, das der Aufrufer als Fehler interpretiert (oder "nichts zurückgegeben" hat).

Was auch immer Ihre Lösung ist, der Anrufer muss den Fall "nichts zurückgegeben" separat behandeln, z. Fangen Sie die Ausnahme oder überprüfen Sie den zurückgegebenen Wert.

    
Anssi 17.02.2010 07:54
quelle
-1

Sie könnten setjmp / longjmp verwenden (siehe Ссылка ), aber aus Sicht der Softwareentwicklung ist es besser für Sie Verwenden Sie entweder Ausnahmen oder Fehlercodes, wie von anderen hier erwähnt.

    
Remy 17.02.2010 07:56
quelle

Tags und Links