Entschuldigung, niemand kann helfen. Für den Abschluss gestimmt. Niemand kann helfen, wenn Sie uns nicht einige Details mit einem Code-Snippet geben
Nawaz
2
Können Sie ein bisschen Beispielcode geben? Und je nach Situation können Sie switchstattdessen einen Block ausprobieren . Sie unterstützen das Brechen.
Piebie
3
Wenn es sich innerhalb einer Funktion befindet, können Sie "return" verwenden.
Poitroae
3
Haben Sie versucht, gotoobwohl es nicht empfohlen wird
Emmanuel N
2
Ich habe eine einfache Lösung dafür. Verwenden Sie ein do {} whie (false); außerhalb der if-Anweisung. Dazu sind keine Codeänderungen erforderlich, und der Benutzer kann jederzeit die break-Anweisung verwenden, wann immer er möchte. Ich wollte dies als Antwort posten, aber diese Frage ist als geschlossen markiert.
IAmSurajBobade
Antworten:
69
Verschachtelte ifs:
if (condition)
{
// half-massive amount of code hereif (!breakOutCondition)
{
//half-massive amount of code here
}
}
Auf die Gefahr hin, herabgestimmt zu werden - das ist mir in der Vergangenheit passiert - werde ich erwähnen, dass eine andere (unpopuläre) Option natürlich die gefürchtete wäre goto; Eine Pause-Anweisung ist nur ein Versteck.
Und schließlich werde ich das allgemeine Gefühl wiederholen, dass Ihr Design wahrscheinlich verbessert werden könnte, so dass die massive if-Aussage nicht notwendig ist, geschweige denn ausbricht. Zumindest sollten Sie in der Lage sein, einige Methoden zu extrahieren und eine Rückgabe zu verwenden:
if (condition)
{
ExtractedMethod1();
if (breakOutCondition)
return;
ExtractedMethod2();
}
Das Refactoring von Chunks in Funktionen verbessert nicht nur die Lesbarkeit, sondern löst möglicherweise auch das ursprüngliche Problem.
Mark B
Auf jeden Fall in Übereinstimmung mit Ihrer zweiten Beobachtung. Ich würde jedoch sagen, dass der bessere Weg darin besteht, das Original zu verfeinern conditionund bei Bedarf neue hinzuzufügen, damit der Codeblock, der eingegeben wird, wenn er erfüllt ist, dem entspricht, was vor dem Bruch der ursprünglichen Idee von OP ausgeführt werden sollte . Dies würde , wie in Ihrem Beispiel einfach aufrufen , um eine Methode, die dann in genannt werden könnte condition2, condition3usw. Blöcke nach Bedarf.
Matt Phillips
9
gotoist eine gute Lösung, wenn Sie aus Gründen des variablen Bereichs keine andere Funktion aufrufen können.
edA-qa mort-ora-y
15
gotosieht verdammt sauberer aus, wenn - wenn nach verschachtelt - wenn verschachtelt.
Adam S
1
@AdamS Das stimmt weitgehend - besonders wenn Ihre Schriftgröße groß oder Ihr Code-Editor-Fenster eng ist. Das Hinzufügen führt jedoch gototendenziell zu einer schnelleren Zunahme der Schwierigkeit, über eine Routine nachzudenken, als das Hinzufügen verschachtelter ifAnweisungen. Bei einer komplizierten Methode würde ich wahrscheinlich das leichtere Verständnis des Kontrollflusses der Sauberkeit vorziehen.
Eww ... Ich rieche etwas Scherzhaftes in dieser Antwort. Natürlich nicht, dass es technisch falsch ist.
Yuck
19
@ Yuck Netter relevanter Benutzername. Was die Scherzhaftigkeit betrifft, na ja, ein wenig, aber ich würde sagen, wenn Ihr Design Sie zunächst in die OP-Situation zwingt, wird die Verwendung eines goto es nicht schlimmer machen. Auch Phoog stellt in seiner gewinnenden Antwort fest, dass verschachtelte Bedingungen wirklich nur oberflächlich unterschiedlich sind.
Matt Phillips
Manchmal haben Sie es mit dem stinkenden Code eines anderen zu tun, und Sie haben nicht ein paar Stunden / Tage Zeit, um ihn in etwas Vernünftiges umzuwandeln ... r.
KayleeFrye_onDeck
Goog, sauber, schöne Lösung in
1
Problem mit goto ist nicht bei der Erstimplementierung. Während der Erweiterung fügt ein anderer Entwickler unwissentlich einige Anweisungen zwischen dem Ende von if-Klammern und der Anweisung jmp: hinzu.
Mandeep Singh
21
Sie müssen Ihre if-Anweisung wahrscheinlich in kleinere Teile aufteilen. Davon abgesehen können Sie zwei Dinge tun:
wickeln Sie die Aussage ein do {} while (false)und verwenden Sie real break(nicht empfohlen !!! riesiger Kludge !!!)
Fügen Sie die Anweisung in eine eigene Unterroutine ein und verwenden Sie returnDies ist möglicherweise der erste Schritt zur Verbesserung Ihres Codes.
Ich habe die verwendete do/whileTechnik gesehen und würde sie nicht unbedingt als Kludge betrachten, sie funktioniert gut und vermeidet Probleme, die auftreten gotokönnen (zum Beispiel den Versuch, über die Variableninitialisierung zu springen)
Nim
Ich würde zustimmen, dass es eine bessere Lösung ist als goto.
@phoog, wahrscheinlich, aber ich würde nicht wissen, die Frage ist C ++ markiert, wo es nicht ...
Nim
@Nim ack, wie habe ich das vermisst?
Phoog
+1, abgesehen von der zusätzlichen Einrückungsstufe (die Sie mit der akzeptierten Antwort ohnehin für die Hälfte des Codes hätten), ist dies wahrscheinlich ideal - es ist wie eine kontrollierte gotound sehr nahe daran, "zu tun, was ich meine" ohne viel von Cruft.
Izkata
3
Sie können nicht aus einer if-Anweisung ausbrechen, es sei denn, Sie verwenden goto.
if (true)
{
int var = 0;
var++;
if (var == 1)
goto finished;
var++;
}
finished:
printf("var = %d\n", var);
Sie könnten ein Label und ein verwenden goto, aber das ist ein schlechter Hack. Sie sollten in Betracht ziehen, einige Elemente in Ihrer if-Anweisung in separate Methoden zu verschieben.
Die Operatoren ||und &&sind Kurzschlüsse. Wenn also die linke Seite von ||Auswertungen zu trueoder die linke Seite von &&Auswertungen zu Falsch ist, wird die rechte Seite nicht ausgewertet. Das entspricht einer Pause.
switch
stattdessen einen Block ausprobieren . Sie unterstützen das Brechen.goto
obwohl es nicht empfohlen wirdAntworten:
Verschachtelte ifs:
if (condition) { // half-massive amount of code here if (!breakOutCondition) { //half-massive amount of code here } }
Auf die Gefahr hin, herabgestimmt zu werden - das ist mir in der Vergangenheit passiert - werde ich erwähnen, dass eine andere (unpopuläre) Option natürlich die gefürchtete wäre
goto
; Eine Pause-Anweisung ist nur ein Versteck.Und schließlich werde ich das allgemeine Gefühl wiederholen, dass Ihr Design wahrscheinlich verbessert werden könnte, so dass die massive if-Aussage nicht notwendig ist, geschweige denn ausbricht. Zumindest sollten Sie in der Lage sein, einige Methoden zu extrahieren und eine Rückgabe zu verwenden:
if (condition) { ExtractedMethod1(); if (breakOutCondition) return; ExtractedMethod2(); }
quelle
condition
und bei Bedarf neue hinzuzufügen, damit der Codeblock, der eingegeben wird, wenn er erfüllt ist, dem entspricht, was vor dem Bruch der ursprünglichen Idee von OP ausgeführt werden sollte . Dies würde , wie in Ihrem Beispiel einfach aufrufen , um eine Methode, die dann in genannt werden könntecondition2
,condition3
usw. Blöcke nach Bedarf.goto
ist eine gute Lösung, wenn Sie aus Gründen des variablen Bereichs keine andere Funktion aufrufen können.goto
sieht verdammt sauberer aus, wenn - wenn nach verschachtelt - wenn verschachtelt.goto
tendenziell zu einer schnelleren Zunahme der Schwierigkeit, über eine Routine nachzudenken, als das Hinzufügen verschachtelterif
Anweisungen. Bei einer komplizierten Methode würde ich wahrscheinlich das leichtere Verständnis des Kontrollflusses der Sauberkeit vorziehen.if (test) { ... goto jmp; ... } jmp:
Ach, warum nicht :)
quelle
Sie müssen Ihre if-Anweisung wahrscheinlich in kleinere Teile aufteilen. Davon abgesehen können Sie zwei Dinge tun:
wickeln Sie die Aussage ein
do {} while (false)
und verwenden Sie realbreak
(nicht empfohlen !!! riesiger Kludge !!!)Fügen Sie die Anweisung in eine eigene Unterroutine ein und verwenden Sie
return
Dies ist möglicherweise der erste Schritt zur Verbesserung Ihres Codes.quelle
do/while
Technik gesehen und würde sie nicht unbedingt als Kludge betrachten, sie funktioniert gut und vermeidet Probleme, die auftretengoto
können (zum Beispiel den Versuch, über die Variableninitialisierung zu springen)goto
und sehr nahe daran, "zu tun, was ich meine" ohne viel von Cruft.Sie können nicht aus einer if-Anweisung ausbrechen, es sei denn, Sie verwenden goto.
if (true) { int var = 0; var++; if (var == 1) goto finished; var++; } finished: printf("var = %d\n", var);
Dies würde "var = 1" als Ausgabe ergeben
quelle
Ich kenne Ihre Testbedingungen nicht, aber ein guter Alter
switch
könnte funktionierenswitch(colour) { case red: { switch(car) { case hyundai: { break; } : } break; } : }
quelle
Es gibt immer eine
goto
Aussage , aber ich würde empfehlen, eineif
mit einer Umkehrung der Bruchbedingung zu verschachteln .quelle
Sie könnten ein Label und ein verwenden
goto
, aber das ist ein schlechter Hack. Sie sollten in Betracht ziehen, einige Elemente in Ihrer if-Anweisung in separate Methoden zu verschieben.quelle
Die Operatoren
||
und&&
sind Kurzschlüsse. Wenn also die linke Seite von||
Auswertungen zutrue
oder die linke Seite von&&
Auswertungen zu Falsch ist, wird die rechte Seite nicht ausgewertet. Das entspricht einer Pause.quelle
Haben Sie ein Etikett an einem Punkt, zu dem Sie springen möchten, und neben Ihrem, wenn Sie goto verwenden
if(condition){ if(jumpCondition) goto label } label:
quelle
Sie können verwendet werden
goto
,return
oder vielleicht nennenabort ()
,exit ()
usw.quelle