Welche Schleife soll ich wann benutzen?
-
Gude
In C++ gibt es ja verschiedene Schleifen.
Jetzt würde ich gerne wissen, wann man am besten welche Schleife benutzen soll.
-
@adii950 Grob:
Eine
for
-Schleife wird meist genommen, wenn man eine vorher bekannte Anzahl an Durchläufen hat.Eine
while
-Schleife wird meist genommen, wenn sich die Abbruchbedingung erst während der Schleifendurchläuf ergibt (berechnet wird).Eine
do-while
-Schleife wird genommen, wenn der Schleifenkörper mindestens einmal durchlaufen werden soll.
-
Zu 99% kommst du mit einer for-Schleife aus, da sie sich genauso wie eine while-Schleife verhält. Nur die do-while Schleife verhält sich unterschiedlich, da dort mind. 1 Schleifendurchlauf gemacht wird.
for-Schleifen haben nach meiner Ansicht den großen Vorteil, dass man alles im Schleifenkopf sieht und den Sinn der Schleife versteht. Vergl.
for( auto data = read_data(); data_valid( data ); data = read_data() ) { process_data( data ); } vs SomeData data = read_data(); while( data_valid( data ) ) { process_data( data ); data = read_data(); }
oder
for ( ;; ) for( ;true; ) vs while( true )
-
@DirkB achso okay verstehe danke dir
-
@DocShoe Ja aber man muss doch sinnvoll die schleifen benutzen und nicht weil man zur 99% die for-schleife benutzen kann die benutzt verstehst du was ich meine?
-
@DocShoe sagte in Welche Schleife soll ich wann benutzen?:
SomeData data = read_data();
while( data_valid( data ) )
{
process_data( data );
data = read_data();
}dieses doppelte read_data() ist etwas lästig
SomeData data; while( data_valid( data = read_data() ) ) { process_data( data ); }
macht es übersichtlicher.
Die Anzahl der Durchläufe hängt von der gültigkeit der Daten ab.
-
Jo, stimmt. Wie gesagt, ich benutzte
while()
Schleifen so gut wie nie, da habe ich mir um so Optimierungen keine Gedanken gemacht. Es stört mich jedenfalls, dass Variablen außerhalb des Scopes leben, das kriegt man mit nerfor
-Schleife besser hin.
-
@adii950 sagte in Welche Schleife soll ich wann benutzen?:
@DocShoe Ja aber man muss doch sinnvoll die schleifen benutzen und nicht weil man zur 99% die for-schleife benutzen kann die benutzt verstehst du was ich meine?
Ja, das ist so.
while
undfor
Schleifen erfüllen die gleiche Funktion, wobei diefor
-Schleife flexibler ist und den scope von benötigten Variablen reduzieren kann. Das ist aber Jammern auf hohem Niveau.
-
@DocShoe hmm okay danke dir
-
@DocShoe Achso okay verstehe danke dir
-
@DocShoe sagte in Welche Schleife soll ich wann benutzen?:
Jo, stimmt. Wie gesagt, ich benutzte while() Schleifen so gut wie nie, da habe ich mir um so Optimierungen keine Gedanken gemacht.
Es geht dabei ja um Lese-Optimierung. Die
while
-Schleife wie im Vorschlag von @DirkB ist besser lesbar als dasselbe in einer for-Schleife.Solche Einleseschleifen wie "solange wie du Daten korrekt einlesen kannst (und die Daten gültig sind), ..." würde ich eher als while-Loop machen. Wenn du das als for-Loop machst, hast du das Einlesen einmal bei der Initialisierung und einmal als 3. Argument des fors.
Im Gegensatz zu dir versuche ich for-Schleifen mit 3 for-Argumenten zu vermeiden. Obigen Fall würde ich also mit
while
lösen. Wenn möglich, würde ichfor
nur in der Range-For-Form nutzen, alsofor (const auto var& : container) { ... }
. Daher meine Daumenregel: je komplizierter die Abbruchbedingung, destowhile
-
Persönliche Präferenz, würde ich sagen. Ich habe mich an das Lesen von for-Schleifen gewöhnt.
-
Ich kann mir vorstellen, dass wir in Zukunft auch mehr sowas hier sehen werden:
for (auto i : integer_range(0, 10))
for (auto data : data_reader(data_source))
... damit kann ich mich durchaus anfreunden, da man so
read_data
unddata_valid
elegant in einem Iterator verpacken kann und den Anwender nicht mit diesen Details belästigt. Schliesslich ist der aller Wahrscheinlichkeit nach nur daran interessiert, die Dateneinträge zu durchlaufen und muss vielleicht nicht unbedingt wissen, wie man diese liest, konkret abschreitet oder wie sie terminiert sind.Dennoch: Als Anfänger natürlich erstmal intim mit
do
/while
/for
und Range-for
für Standardcontainer vertraut werden. Die oben gennanten Beispiele sind für Fortgeschrittene - zumindest wenn man sowas selbst implementieren will.
-
Ist jetzt vielleicht nicht im engeren Sinne eine "Schleife", aber es gibt auch noch die Möglichkeit mit 'goto' zu arbeiten. Die Lösung bietet sich an, wenn du ganz wilde Konstrukte hast (z.B. mehrere optionale "Absprung-Punkte" und mehrere unterschiedliche "Einsprung-Punkte").
-
@meiru wenn du regelmaessig mit
goto
rumwurschteln musst, um halbwegs durch deinen code zu kommen, hast du ein groesseres problem als die entscheidung zwischenfor
und (do
)while
-
@meiru vielen Dank, aber wir dürfen an der Uni kein 'goto' benutzen
-
@Cardiac ich spiele nicht mit 'goto' herum wir dürfen es nicht benutzen
-
@adii950 sagte in Welche Schleife soll ich wann benutzen?:
Gude
In C++ gibt es ja verschiedene Schleifen.
Jetzt würde ich gerne wissen, wann man am besten welche Schleife benutzen soll.For loops allow you to iterate over an array.
The for loop should be used when n times should be executed.
For reading files into variables, use a while loop.
When asking for user input, use a while loop.
A while loop should be used when the increment value is nonstandard.
The do-while loop is mainly used in the case where we need to execute the loop at least once.