Mit break aus for(..;..;..) raus?



  • In der Schule durften wir im Struktogramm auch kein "break" verwenden, sondern man musste die Schleifeneintrittsbedingung ungültig machen. Im Prinzip läuft beides aufs gleiche raus.
    Aber auf ein vorzeitiges Verlassen der Schleife verzichten zu müssen macht imho keinen Sinn.

    Warum sollte das mathematisch nicht validierbar sein? Es ist doch vorhersehbar welche Werte die Schleife zum vorzeitigen Abbruch führen.

    Was sagt(e) dein Lehrer denn zu continue?



  • EEK schrieb:

    user schrieb:

    Ich finde das es immer besser ist eine Schleife bis zum ende laufen zu lassen. DIe Rechner werden ja immer schneller. Macht ja nichts wenn das Programm dann langsamer wird weil man eine Schleife nicht bereits beendet obwohl das erreicht wurde was man wollte.

    Dann lass mal in der Schleife 100000000 mal irgendwelche Berechnungen ausführen obwohl das Ergebnis eigentlich schon nach 2 Durchläufen feststeht. Und dann schau mal ob es dir nicht evtl. doch zu lange dauert.

    Schon mal was von Zynismus gehört?



  • Mr Evil schrieb:

    was machst du dann damit?

    for(;;)
    {
        if(MouseMove() == true)
            break;
        ShowBildschirmSchoner();
    }
    

    wie kannst du den bildschirmschoner beenden ohne break oder return?

    while(!MouseMove()) {
        ShowBildschirmSchoner();
    }
    

    Mr Evil schrieb:

    for(unsigned int i = 0; i<200000; ++i)
    {
        if(DoBerechnung() == true) // eine berechnung dauert 5 min
            break;
    }
    

    soll nun jedesmal weiterhin die berechnung laufen obwohl das ergebnis fest steht?
    und dann pro durchlauf 5 min?

    unsigned int i = 0;
    while(i < 200000 && !DoBerechnung()) {
       i++
    }
    

    aber natürlich spricht nichts gegen ein break in schleifen wenns angebracht ist.



  • user schrieb:

    Schon mal was von Zynismus gehört?

    Ja, aber

    user schrieb:

    Ich finde das es immer besser ist eine Schleife bis zum ende laufen zu lassen.

    hört sich für mich nicht nach Zynismus an. Und wenn du dich gleich angegriffen fühlst, dann ist das nicht mein Problem.



  • stellt euch vor ihr hättet eine shleife die 100000000 durchlaufen soll

    Da war sein Argument die Schleifenbedingung eben so aufzubauen dass sie ggf. erfüllt bzw. unerfüllt ist und die schleife beendet...

    @Marc++us:

    😮

    ??

    Ja hat mich nur interessiert...hat damals sogar auch Punkte bei Tests gekostet wenn wir das so verwendet haben glaub ich... 😞
    Aber jetz an der Uni bin ich eben manchmal überrascht was da von einigen gesagt wird (bzw. es gibt natürlich auch da leute die oft was anderes sagen aber meistens stimmen sie überein... aber bei diesem Thema... 🙄 )



  • KasF schrieb:

    Kuldren schrieb:

    Ich hab in der schule (htl) von den lehrern immer gehört schleifen soll man nicht breaken

    Stimme ich nicht zu. Mir fallen keine Gründe ein, wieso man eine Schleife, die nichts mehr zu tun hat, nicht mit break beenden sollte, sodass sie nicht unnütz weiterläuft.

    Aber das stellt doch die Abbruchbedingung schon sicher. Wofuer also ein break?



  • Apollon schrieb:

    Aber das stellt doch die Abbruchbedingung schon sicher. Wofuer also ein break?

    Was machste mit einem

    while(irgendeine Bedingung)
    {
      if(erste Operation erfolgreich) break;
      zweite Operation
    }
    

    Wir das Programm wirklich besser, wenn ich dafür ne extra bool-variable einführe, die ich auf true setze wenn ich fertig bin und die dann in der Bedingung mit drinsteht? -- Ich finde nicht.



  • Jester schrieb:

    ...
    Was machste mit einem

    while(irgendeine Bedingung)
    {
      if(erste Operation erfolgreich) break;
      zweite Operation
    }
    

    ...

    while(irgendeine Bedingung && !(erste Operation erfolgreich))
       zweite Operation
    

    Wieso nicht ?

    Ich persönlich bevorzuge klare Abbruchbedingungen, weil man dann sofort "im Schleifenkopf" sehen kann, wann sie abbricht.

    Aber ich bin kein prinzipieller Gegener von break (oder return, throw, ...); sehr verschachtelte Bedingungen können mit break&Co lesbarer gemacht werden, aber bei "langen Schleifenkörpern" kann die Übersichtlichkeit auch darunter leiden.

    Gruß,

    Simon2.



  • while(irgendeine Bedingung)
    {
      if(erste Operation erfolgreich) break;
      zweite Operation
    }
    

    meistens kam das argument...auch hier würds funktionieren:
    dass man mit den bedingungen( boolsche oder was auch immer für variablen)
    ein break umgehen kann:

    while(irgendeine Bedingung)
    {
      if(erste Operation erfolgreich) irgendeine bedingung=false;
      else  
      zweite Operation
    }
    

    bzw. kann man ja mehrere argumente in die bedingung einbauen und mit UND bzw. ODER verknüpfen...

    Ich wollte lediglich wissen ob es (technische) gründegibt break nicth zu benutzen 😉
    war ein argument der lehrer und ich verstehe nicht welch technische gründe das haben könnte...



  • Simon2 schrieb:

    while(irgendeine Bedingung && !(erste Operation erfolgreich))
       zweite Operation
    

    Wieso nicht ?

    Mach bitte aus erste Operation was zwei- oder dreizeiliges. 🙂



  • Also was mir einfallen würde, ist daß du einfach die Schleife undefiniert abbrichst und der resltiche Code nicht ausgeführt wird. Aber wenn du genau weisst, warum du an diesem Punkt rausspringst ist ja egal...



  • Jester schrieb:

    Was machste mit einem

    while(irgendeine Bedingung)
    {
      if(erste Operation erfolgreich) break;
      zweite Operation
    }
    

    Es gibt keinen Zusammenhang zwischen "irgendeine Bedingung" und "erste Operation". Aber beide beenden die Schleife. Was soll sowas ?

    🙂



  • Naja, hier gibt es wieder zwei Parteien. Ich bleibt dabei und benutze break da, wo es mir passend erscheint 😉



  • merker schrieb:

    Jester schrieb:

    Was machste mit einem

    while(irgendeine Bedingung)
    {
      if(erste Operation erfolgreich) break;
      zweite Operation
    }
    

    Es gibt keinen Zusammenhang zwischen "irgendeine Bedingung" und "erste Operation". Aber beide beenden die Schleife. Was soll sowas ?

    🙂

    Sowas schreibt man meistens wenn "irgendeine Bedingung" keine Seiteneffekte hat, "erste Operation" aber schon. In dem Fall halte ich es so wie es oben steht auch für wesentlich klarer als wenn beides im Schleifenkopf steht.

    Sich auf die Kurzschlusslogik zu verlassen damit bestimmte Teile eines Ausdrucks mit boolschen Operatoren in einer Schleifenbedingung nichtmehr ausgeführt werden halte ich für Mist, vor allem wenn diese Teile eben Seiteneffekte haben.
    Pfui Pfui Pfui.

    @OP: nein, technische Gründe gibt es nicht.



  • Jester schrieb:

    Simon2 schrieb:

    while(irgendeine Bedingung && !(erste Operation erfolgreich))
       zweite Operation
    

    Wieso nicht ?

    Mach bitte aus erste Operation was zwei- oder dreizeiliges. 🙂

    bool erste_operation_erfolgreich()
    {
      ...
    }
    

    4 zeilen 😉



  • klar kann man die schleifen immer in eine while umformen
    aber was ist wenn da sehr viel verschiedener code ist - das wird dann schon schwerer

    for(unsigned int i=0; i<1000000000; ++i)
    {
        .
        .
        .
        .
        .
        .
        .
        .
            if(jes)
            {
                .
                .
                .
                .
                if(jes2)
                {
                    .
                    .
                    .
                    .
                    break;
                }
                else if(aha)
                {
                    .
                    .
                    .
                    if(jes2)
                    {
                        .
                        .
                        .
                        .
                        break;
                    }
                }
                .
                .
                .
                .
                .
                .
                .
            }
        .
        .
        .
    }
    


  • Einfache Regel: Alle Abbruchbedingungen, die man ohne Probleme im "Schleifenkopf" einbringen kann, bringt man dort ein. Alle anderen nicht.

    Ein Zwang sorgt nur für unleserlichen Code! Viel wichtiger ist es kurze Funktionen (also auch schleifen) zu schreiben. Wenn eine Schleife mehr als (sagen wir mal) 5 Zeilen hat, verliert man ohnehin schnell die Übersicht und sollte lieber Unterfunktionen benutzen.

    Die Vorstellung von "Single Entry/Single Exit" ist in Programmiersprachen mit Exceptions eh schädlich, da man darüber keine Kontrolle mehr hat (außer man zwingt sich künstlich eine auf).



  • Ich will nicht kleinelich sein, aber wenn ich schon break verwende dann mach ich's so dass es auch auffällt und schreib's auf eine eigene Zeile.

    while (irgendeine Bedingung) {
    
        if (erste Operation erfolgreich) 
            break;
    
        zweite Operation;
    }
    

    Eine generelle Antwort auf die Frage "break/continue/return" oder nicht wird's glaube ich nicht geben.

    Die Verwedung

    - muss korrenkt sein
    - sollte performant sein
    - sollte gut lesbar sein

    Dann ist es imho o.k.

    Wenn man alles im Schleifenkopf machen kann würde ich's auch tun wenn die Ausdrücke nicht zu komplex sind.
    Möglichst vermeiden würde ich allerdings break nach Konditionalen die über einem Laufindex operieren, so im Sinne von "Wenn der nächste Wert soundso dann break".
    Damit führt man den Leser in die Irre.

    Grüsse

    *this



  • otze schrieb:

    mein info lehrer hat mir auch sowas gesagt, er meinte, dass die funktionen dann nicht mehr mathematisch validierbar sind *schulterzuck*

    Halte ich persönlich für Unsinn. ZB sind in C/C++ while-Schleifen ja grundsätzlich nicht mathematisch validierbar. Wenn es so wäre, würde man wohl eher zur for-Schleife greifen.
    Was die eigentliche Frage betrifft, so sollte man immer die Laufbedingung nutzen, um die Schleife zu verlassen. Wenn das allerdings nicht so einfach möglich ist, spricht nichts gegen break.



  • groovemaster schrieb:

    Halte ich persönlich für Unsinn. ZB sind in C/C++ while-Schleifen ja grundsätzlich nicht mathematisch validierbar.

    Dazu zwei Fragen:

    - Was genau bedeutet für euch "mathematisch validierbar"?
    - Warum sind while-Schleifen in C++ grundsätzlich nicht validierbar?


Anmelden zum Antworten