kostenloser Webspace werbefrei: lima-city


While-Schleife mit break beenden

lima-cityForumProgrammiersprachenPython

  1. Autor dieses Themas

    grashuepfer

    grashuepfer hat kostenlosen Webspace.

    Hallo,

    wieso sollte man while-Schleifen mit break beenden und nicht einfach die while-Bedingung entsprechend anpassen?

    In welchen Situationen soll man den Schleifenablauf mit break beenden? Wo hat es Vorteile?

    Kann mir jemand vielleicht sogar ein konkretes Beispiel geben?

    Viele Grüße,
    grashuepfer
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hallo grashuepfer,


    mit break kannst du ja die ausführung der aktuellen for-, foreach-, while-, do-while- oder switch-struktur beenden.
    sinnvollerweise benutzt man break wiederum in verbindung einer if-bedingung, was wie du sagtest im falle einer while-schleife wohl eher nur sinn macht wenn sich die bedingungen von while und if unterscheiden sollen - also wenn du möchtest das die schleife vorzeitig beendet wird obwohl die schleifenbedingung noch nicht erfüllt ist, zb.:
    <?php
    
      $email[] = "napoleon@corsica.example.com";
      $email[] = "cesar@rome.example.com";
      $email[] = "joe@example.com";
      $email[] = "alexander@thegreat.example.com";
      $email[] = "michael@angelo.example.com";
    
      $i = 0;
      $anzahl = count($email);
      while ($i < $anzahl) {
        echo "Der derzeitige Arrayindex ist: " , $i , "<br>";
        if ($email[$i] == "joe@example.com") {
          echo "Joes E-Mail-Adresse ist dabei.";
          break;
        }
        $i++;
      }
    
    ?>



    lg hechma
  4. grashuepfer schrieb:
    wieso sollte man while-Schleifen mit break beenden und nicht einfach die while-Bedingung entsprechend anpassen?

    Dem break haftet der Geruch des verpönten goto an, d.h. es führt oftmals zu unstrukturiertem code.
    Zumeist gibt es außer einer gewissen Faulheit des/der Enwicklers/in keinen guten Grund den Kontrollfluß mittels break zu sabotieren.

    Intuitiv hast du offenbar bereits erkannt ("it smells"), daß der while-Term zur Terminierung herangezogen werden sollte.
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    suge schrieb:
    Dem break haftet der Geruch des verpönten goto an, d.h. es führt oftmals zu unstrukturiertem code.
    Zumeist gibt es außer einer gewissen Faulheit des/der Enwicklers/in keinen guten Grund den Kontrollfluß mittels break zu sabotieren.
    Das Problem an dieser Sache ist, dass dies teilweise zu sehr krankhaften Auswüchsen führt.

    Es gibt sowohl für goto, als auch für break und continue sehr sinnvolle Anwendungen, wo alles andere hässlicher, langsamer und ineffizienter Code wäre. Das Problem ist dann nur, dass manche glauben »goto ist ein Konstrukt des Teufels, das darf man nicht verwenden«.

    Ein Beispiel: du initialisierst ein Objekt X. Wenn dies erfolgreich war, dann initialisierst du Y. Und wenn dies auch erfolgreich war initialisierst du Z. War auch das erfolgreich kann die Berechnung / Verarbeitung beginnen; am Ende müssen die Objekte wieder freigegeben werden. Schlägt aber eine dieser Initialisierungen fehl, so müssen (in verkehrter Reihenfolge) die initialisierten Objekte sofort wieder freigegeben werden. Wie löst man das ohne goto? In einer unübersichtlichen if-Orgie. Und mit goto? Da stehen am Ende der Funktion in verkehrter Reihenfolge die Befehle zum Freigeben der Objekte, also free(Z), free(Y), free(X) und davor je ein Label. Schlägt eine Initialisierung fehl, so springt man genau zum richtigen Label und der Rest erledigt sich von selbst → goto ist elegant, sinnvoll und effizient, alles andere wäre Pfusch.

    Eine einfache Faustregel: mit goto über etwas drüberspringen (nach vorne) ist ok (= goto z; … z: …), zurück springen nicht (= z: … goto z;).

    Auch für break/continue gibt es sinnvolle Anwendungen, wo alles andere Pfusch wäre. Dennoch hört/liest man oft von Leuten, die auch diese Konstrukte für ein Werk des Teufels halten, welche automatisch zu unstrukturiertem Code führen würden.

    Meine Meinung: wer goto/break/continue direkt verteufelt kann nicht programmieren und verschwendet mit großer Sicherheit unnötig Rechenleistung. Es hat schließlich einen Grund, dass es diese Konstrukte gibt. Außerdem noch nebenbei bemerkt: am Ende ist es der Prozessor, der nichts anderes als goto und bedingtes goto ausführen kann.

    Zurück zur Frage: »Wann ist break sinnvoll«?
    Meist dann, wenn es ohne break unübersichtlicher und umständlicher wird. Unübersichtlich und umständlich kann dabei durchaus auch die Ausführungsgeschwindigkeit beeinflussen. Unübersichtlich und umständlich kann es beispielsweise dann werden, wenn es viele verschiedene Punkte gibt, an denen eine Schleife beendet werden kann.

    hechmas Beispiel ist übrigens keine sinnvolle Anwendung und fällt nicht mal unter Faulheit, sondern eher »was ist break«.
  6. hallo grashuepfer und hackyourlife,


    hechmas Beispiel ist übrigens keine sinnvolle Anwendung und fällt nicht mal unter Faulheit, sondern eher »was ist break«.
    nun das sollte auch eher dem wunsch nach einem
    konkretes Beispiel
    nachkommen.



    manchmal hängt die abbruchbedingung für eine schleife von einem wert ab der nicht exakt vorher gesehen werden kann und der sich erst im auszuführenden codeblock ergibt. hier ein kleines beispiel was vielleicht mehr sinn ergibt:
    <?php
    	// mische karten und zeige als wievielte die Herz-Dame gezogen wird
    	
    	$aKartenwerte = array("Bube", "Dame", "König", "As"); 
    	$aKartenfarben = array("Karo", "Herz", "Pik", "Kreuz"); 
    	
    	shuffle($aKartenwerte);
    	shuffle($aKartenfarben);
    	
    	$iKarte = 0;
    	
    	$iKartenwert = 0;
    	while($iKartenwert<count($aKartenwerte)) {
    		$iKartenfarbe = 0;
    		while($iKartenfarbe<count($aKartenfarben)) {
    			$iKarte++;
    			if($aKartenwerte[$iKartenwert]=="Dame" and $aKartenfarben[$iKartenfarbe]=="Herz"){  
    				break(2); 
    			} 
    			$iKartenfarbe++;
    		}
    		$iKartenwert++;
    	}
    	
    	echo "Die Herz-Dame wurde als ".$iKarte.". Karte gezogen";
    ?>




    lg henning
  7. An dieser Stelle würde ich gerne nochmal die Aufmerksamkeit zurück zu Python bringen.
    In Python gibt es nur kopfgesteurte While-Schleifen. Das bedeutet, dass die Bedingung erst überprüft wird und wenn diese erfüllt ist wird die Schleife durchlaufen. Dabei kann es jedoch passieren, dass die Schleife gar nicht durchlaufen wird. Will man eine Schleife bauen, die auf jeden Fall einmal durchlaufen wird, so braucht man (in Python) break.
    while True:
        tueEtwas()
        if erfüllt():
            break


    Ansonsten kann ich mich nur dem anschliesen, was hackyourlife bereits gesagt hat.
  8. Noe, brauchste nicht:
    isLoopEnabled = True
    while(isLoopEnabled):
        doSomeThingUseful()
        if exitRequested():
            isLoopEnabled = False
        else:
            doOtherStuff()
        doThisAtLeastOnce()

    Letztendlich ist das Alles eine Geschmacksfrage und bei trivialem code nicht der Rede wert.
    "In the long run" sind aber nicht alle "gutgemeinten" Sprachkonstrukte relevant. Viele Wege führen eben nach Rom...
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!