break oder verschachtelte ifs



  • Hiho,

    in meinem Programm arbeite ich zur Zeit recht viel mit endlosschelifen (while(true)) und habe mich entschieden gehabt, einfach, wenn ich sie verlassen will (geschieht an mehreren stellen) per break rauszuhüpfen, anstatt eine bool variable in die kondition zu setzen und jedesmal wenn die schleife vielleicht verlassen werden soll das per if abzufragen, die bool variable auf false zu stellen und den ganzen rest in den elseblock.

    also quasi

    while(true){
        ...
        if(Abbruchmöglichkeit 1) break;
        ...
        if(Abbruchmöglichkeit 2) break;
        ...
    }
    

    statt

    bool flag=true;
    while(flag){
        ...
        if(Abbruchbedingung 1) flag=false;
        else{
            ...
            if(Abbruchbedingung 2) flag=false;
            else{
                ...
            }
        }
    }
    

    Da nun aber break eigentlich dem so verpönten goto recht ähnlich ist frage ich mich, ob es allgemein als schlechter Programierstil angesehen ist oder ob es so in Ordnung geht? Und wenn es schlechter Programmiercode wäre, würde mann dann echt die verschachtelten if-else nutzen? Oder welche Methode wird angewandt?



  • Machs doch so:

    bool flag=true;
    while(flag){
        ...
        if(Abbruchbedingung 1) flag=false;
        else if(Abbruchbedingung 2) flag=false;
        //...
        else flag=true;
    }
    

    Ob das schöner is weis ich ned..



  • ich seh darin kein problem

    was auch gehen wuerde waehre

    while(true){
        ...
        if(Abbruchmöglichkeit 1 ||
           Abbruchmöglichkeit 2)
            break;
        ...
    }
    

    kommt aber jeweils auf den code an, ich pers find das absolut in ordnung

    es wuerde auch gehen

    do{
        ...
    }while(!Abbruchmöglichkeit 1 || !Abbruchmöglichkeit 2);
    

    ist aber ebenfals code bedingt



  • deine beiden Möglichkeiten gehen in meinem Fall nicht, die Abbruchbedinge sind benutzereingaben (wenn der Benutzer &exit eingibt soll er zur "Hauptkommandozeile" des Programms zurückkehren können. Ergo muss ich die Teile nacheinander abwickeln. (kein or oder else if möglich)

    Break zählt also im Gegensatz zu goto nicht zu (allgemen angesehen, bis auf ein paar Ausnahmen) schlechtem Programmierziel sondern wäre hier richtig verwendet, ja?



  • Ja, mach ruhig, wenn das Programm so verständlicher ist.
    Oder um Volkard zu Zitieren: "Schreiben Sie langweilige Programme!" Quelle



  • die seite die du da gepostest hast find ich total kaese

    schleife solange keiner gewonnen hat
        mensch zieht
        wenn gewonnen
            ausgabe mensch hat gewonnen
        sonst
            rechner zieht
            wenn gewonnen
                ausgabe rechner hat gewonnen
    

    find ich wirklich sehr verstaendlich!!
    die seite liest sich als wuerde Volkard (wer is das ?) gotos gut heissen



  • break und continue sind beides Elemente von Schleifen und haben mit goto erstmal nix gemeinsam.

    break sagt einfach nur: Beende diese Schleife.
    continue sagt, ok, nächste Runde 😉

    Ich würds vergleichen mit dem else einer if-schleife, gehört halt einfach dazu;)

    goto hingegen ist ein ganz anderes (und oft diskutiertes) Problem. imho ist goto ein Überbleibsel aus den Anfangstagen von C. In gut 15 Jahren C++ habe ich es noch kein einziges mal gebraucht... Es mag sicher Situationen geben wo ein goto sinnvoll ist...



  • Ok, danke an alle.

    Mr Evil schrieb:

    die seite die du da gepostest hast find ich total kaese

    schleife solange keiner gewonnen hat
        mensch zieht
        wenn gewonnen
            ausgabe mensch hat gewonnen
        sonst
            rechner zieht
            wenn gewonnen
                ausgabe rechner hat gewonnen
    

    find ich wirklich sehr verstaendlich!!
    die seite liest sich als wuerde Volkard (wer is das ?) gotos gut heissen

    Volkard ist mod in diesem Forum. Ich ahbe auch mit seinem Kurs angefangen und etwas per Email zugemüllt (sry Volkard) Ich bezweifle, dass er ein Verfechter für goto ist. Das wo du da zitierst wird mit ner while schleife und ner if abfrage sehr einfach realisiert. Nix mit goto.



  • Mr Evil schrieb:

    wer is das ?

    Der da.

    Mr Evil schrieb:

    die seite liest sich als wuerde Volkard gotos gut heissen

    Darum geht es nicht. Die Zielsetzung ist, möglichst unkompliziert Programme zu schreiben, da diese verständlicher sind und weniger fehleranfällig. Und wenn goto diesem Zweck dient, dann kann man es auch verwenden. Die ganzen "goto ist böse" Rufe sollen einem eigentlich nur klar machen, dass es nicht gebräuchlich ist, da man andere Konstrukte hat, die besser zum Codefluss passen.



  • das Problem mit goto ist auch weniger das goto an sich, sondern eine typische denkweise der Progger die vor allem unter Anfängern sehr verbreitet ist: Wenn der Compiler es compiliert, dann muß es ja richtig sein...

    Vieles in C++ ist Scope-Basiert. goto aber kann scopes "übespringen". Folgender Code ist rein syntaktisch daher vollkommen legal (wenn auch total Sinnfrei)

    void testg() {
    	for( int i=0; i<10; ++i) {
    		int* x = new int;
    x_label:
    		delete x;
    	}
    
    	for( int j=0; j<10; ++j) {
    		goto x_label;
    	}
    }
    

    Und führt natürlich garantiert zu einem Absturz. Bei den wenigen Zeilen sieht man den Fehler natürlich (hoffentlich) sofort. Aber jetzt stellt euch einfach vor das wären 1000 Zeilen oder mehr...

    Ich würde übrigends drauf wetten das 2 von 3 Anfängern bei obigem Code dann das delete asukommentieren würden und dann sagen: Bug gefixed, läuft jetzt ohne Abzustürzen... (ok, wenn ich ehrlich bin denke ich 9 von 10, aber mein Therapeut sagt ich solle nicht so zynisch sein...)



  • gegen break und continue spricht nichts, kann man gerne verwenden. im beispiel sieht man ja schon, wie simpel der break-code zu lesen ist und was für ein klammer-gewüst die if-else kette wird. ausserdem spart man eine variable 😉



  • schieb dir doch einfach n dildo in arsch du affe



  • @Shinja

    ah ok, dann hab ich die page falsch verstanden {=

    #zusammenfass:
    goto = boese
    break, continue = nicht boese

    ich wuerd sagen das liegt daran

    mit goto kann man von seite 1 im code zu seite 215 zeile 23 springen
    mit break beendet man immer die aktuelle schleife
    welches da uebersichtlicher ist ist ja wohl klar



  • Mr Evil schrieb:

    mit goto kann man von seite 1 im code zu seite 215 zeile 23 springen

    Ich bezweifle, dass jemand 215-seitige Funktionen einsetzt. Und wenn, dann macht das goto den Braten auch nicht mehr fett :xmas1:


Anmelden zum Antworten