Wie kann ich aus einer if-Anweisung „ausbrechen“? [geschlossen]

74

Ich habe eine if-Anweisung, aus der ich "ausbrechen" möchte. Ich verstehe, dass Pause nur für Schleifen ist. Kann jemand helfen?

Für diejenigen, die ein Beispiel dafür benötigen, was ich versuche:

if( color == red )
{
...
if( car == hyundai ) break;
...
}
Wir s
quelle
3
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 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();
}
Phoog
quelle
7
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.
Phoog
43
if (test)
{
    ...
    goto jmp;
    ...
}
jmp:

Ach, warum nicht :)

Matt Phillips
quelle
1
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.


quelle
6
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);

Dies würde "var = 1" als Ausgabe ergeben

DIP Schalter
quelle
3

Ich kenne Ihre Testbedingungen nicht, aber ein guter Alter switchkönnte funktionieren

switch(colour)
{
  case red:
  {
    switch(car)
    { 
      case hyundai: 
      {
        break;
      }
      :
    }
    break;
  }
  :
}
Nim
quelle
2

Es gibt immer eine gotoAussage , aber ich würde empfehlen, eine ifmit einer Umkehrung der Bruchbedingung zu verschachteln .

Sergey Kalinichenko
quelle
2

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.

Daniel Gabriel
quelle
2

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.

Mark Ransom
quelle
2

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:
Emmanuel N.
quelle
1

Sie können verwendet werden goto, returnoder vielleicht nennen abort (), exit ()usw.


quelle