Laden...

For-Schleife anstatt do-while?

Erstellt von norman_timo vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.952 Views
norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 17 Jahren
For-Schleife anstatt do-while?

Hallo zusammen,

ich habe soeben einen Beispielcode entdeckt, der mir bei meinem Problem weiterhilft. Was mich jedoch stutzig gemacht hat ist folgender Konstrukt:

    
for (;;) {
      // irgendwas
      if (Abbruchkriterium) break;
      // irgendwas
}

Was bringt es für Vorteile solch eine for-Schleife zu nehmen, anstatt ein do-while zu verwenden?

Mal davon abgesehen, dass der Compiler beide Varianten zum selben Ausführcode compilieren wird (vermute ich mal).

Rein kosmetisch betrachtet finde ich solch ein Konstrukt eher unleserlich, oder übersehe ich da etwas?

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

M
174 Beiträge seit 2006
vor 17 Jahren

Ich denke mal das ist eher eine vorliebe des jeweiligen Programmierers!
Ich würde dafür eher while( true ) schreiben!

1.665 Beiträge seit 2006
vor 17 Jahren

Folgendes bewirkt eigentlich das Selbe, also finde ich, dass
while (Abbruchkriterium)
{
}

viel leserlicher ist, und sofort verständlich.

3.825 Beiträge seit 2006
vor 17 Jahren
while (true)
{
      // irgendwas
      if (Abbruchkriterium) break;
      // nochwas
}

macht Dasselbe.

Manchmal muss man vor und nach dem Abbruchkriterium Code ausführen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 17 Jahren

Hallo zusammen,

ja, ich denke ich hätte es so geschrieben:


do
{
} while (Abbruchkriterium)

weil ich Abbruchszenarien in der Schleife für "unschön" halte (manchmal ist es performanter und unumgänglich, aber wenns vermeidbar ist...).

Also keine Vor- oder Nachteile, rein kosmetische Natur, danke für diese Info.

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

347 Beiträge seit 2006
vor 17 Jahren

LOL! Wirklich innovativ schlecht wäre...

for (;!Abbruchkriterium;)
{
      // irgendwas
}

...
Das oben im OP ist einfach nur schlecht schlecht. 😁
ich weiß schon, warum ich ein Pascal-for bevorzuge. 😉

Versuche das mal für etwas anderes zu missbrauchen oder auch nur falsch zu verstehen. 😉:::{style="color: blue;"}for){blue} i : Integer := 0 (to){blue} list.Count - 1 (do){blue}

N
750 Beiträge seit 2004
vor 17 Jahren

müsste es nicht heissen:


do
{
} while ( ! Abbruchkriterium) 

die leerzeichen hab ich mal bewusst geschrieben 🙂

?( wer suchet, der findet auch! :]

S
281 Beiträge seit 2004
vor 17 Jahren

For-Schleifen sind Zählerschleifen, diese nutzt man, sofern der Anfang und das Ende Bekannt sind.

Do-/While ist eine fußgesteuerte schleife welche man nutzt wenn die anzahl der durchläufe unbekannt sind und die schleife mindestens einmal durchlaufen werden soll

while ist die kopfgesteuerte schleife nutzt man ebenfalls wenn die anzahl der durchläufe unbekannt sind, aber die schleife u.u nicht ausgeführt werden soll (kriterium wird ja im kopf geprüft)

und ich glaube eine for-schleife bringt nen kleinen geschwindigkeitsvorteil und es ist etwas komfortabler und übersichtlicher

wenn du bis 100 mit ner while schleife zählen müsstest, würdeste noch ne zählvariable brauchen und diese müsste dann noch inkrementiert werden usw
da ist es doch besser wenn man start, ende und die zählschritte alles oben in der zählerschleife hat

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 17 Jahren

Hallo st@tic,

und ich glaube eine for-schleife bringt nen kleinen geschwindigkeitsvorteil und es ist etwas komfortabler und übersichtlicher

Das halte ich jetzt mal für ein Gerücht, zumal dass das Abbruchkriterium nicht immer ein Integer Wert sein muss. Mit einer For-Schleife spart man sich lediglich "die Arbeit" ein "Zähler" anzulegen, ein Abbruchkriterium zu definieren, und den "Zähler hochzuzählen". -> Eine völlig legitime For-Schleife könnte auch sein:

(untested🙂


for (string sTest = "Hallo"; sTest.Length > 0; sTest = sTest.Substring(0, sTest.Length-2))
{
    // Tue etwas
}

Ein wirklicher Geschwindigkeitsvorteil bringt foreach im Gegensatz zu for, da hier die Elemente durchgegangen werden, ohne dass sich diese vom Wert verändern dürfen (kann also intern durch Pointerarithmetik abgehandelt werden).

Eine for-Schleife bringt Performance-mäßig keine Vorteile gegenüber einer while, das wollte ich hier eigentlich bestätigt haben.

@Robert G:
LOL es gibt schon unheimlich unheimliche Konstrukte 😉

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo norman_timo,

das entscheidende ist doch, dass die Schleife im Original-Post ist eine middle-checked loop ist. Da C# nur pre- und post-checked loops kennt, muss man halt eine Endlosschleife nehmen und in der Mitte ein if/break. Deshalb ist do/while hier auch nicht wirklich passend.

Endlosschleifen schreiben ich immer als for (;;). Aber das ist reine Geschmackssache. Viele schreiben hier auch while (true).

herbivore

830 Beiträge seit 2005
vor 17 Jahren

Hallo,

Original von norman_timo
Eine for-Schleife bringt Performance-mäßig keine Vorteile gegenüber einer while, das wollte ich hier eigentlich bestätigt haben.

Wenn es das war was du wolltest, hat sichs ja eigentlich, aber etwas Senf habe ich auch noch:

Bei dem for-Konstrukt, welches du in deinem 1. Beitrag gepostet hast, wird beim Zutreffen der Abbruchbedingung nur ein Teil des Codeblocks durchlaufen. Bei allen anderen genannten Varianten mit do-while, while, oder der eigenwilligen Variante von Robert G. wird immer der ganze Codeblock durchlaufen, oder gar nicht.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

347 Beiträge seit 2006
vor 17 Jahren

Das halte ich jetzt mal für ein Gerücht, zumal dass das Abbruchkriterium nicht immer ein Integer Wert sein muss. In der Theorie kann der Compiler statische Teile der Abbruchbedingung so extrahieren, dass sie nur einmalig evaluiert werden müssen.
Also praktisch so wie ein Pascal-for funktioniert.
Ein wirklicher Geschwindigkeitsvorteil bringt foreach im Gegensatz zu for, da hier die Elemente durchgegangen werden, ohne dass sich diese vom Wert verändern dürfen (kann also intern durch Pointerarithmetik abgehandelt werden). Theoretisch ja, praktisch wird hier ein externer Iterator benutzt und diese Abstraktion kostet fast immer mehr.
Lässt sich aber auch in ein for quetschen 😁 :

for (IEnumerator<Miep> miepEum = list.GetEnumerator(); miepEum.MoveNext();)
{
    if (miepEnum.Current == blabla)
      DoSomething(miepEnum);
}

@Robert G:
LOL es gibt schon unheimlich unheimliche Konstrukte 😉 C-ish for-Schleifen sind allgemein dafür bekannt für unchristliche Dinge misbraucht zu werden.
Prost:

for(;P("\n").R-;P("|"))for(e=3DC;e-;P("_"+(*u++/8 )%2))P("| "+(*u/4)%2); 
347 Beiträge seit 2006
vor 17 Jahren

Original von Friedel
der eigenwilligen Variante von Robert G. wird immer der ganze Codeblock durchlaufen, oder gar nicht. Stümmt, hatte das irgendwas vor der Bedingung nicht beachtet...