While Schleife mit Dekrement verstehen?
Hi, Ich verstehe nicht so ganz wie man diese while(n--) schleife interpretieren soll und wieso immer genau n Sterne (je nach Eingabe) ausgegeben werden? ich kenne die äquivalente längere Form der Schleife, aber die scheint mir irgendwie auf den ersten Blick auch nicht einleuchtender, weil dann steht dann ja:
while(n) {
n=n-1;
Anweisung;}
n = n-1;
ich hätte gedacht es wird nur ein Stern ausgegeben, weil die Bedingung von while(n) ist doch nur einmal erfüllt oder nicht?
Mfg
3 Antworten
In C/C++ und anderen Sprachen entsprechen Zahlen != 0 dem booleschen TRUE.
Eine while Schleife läuft solange, wie ihre Bedingung TRUE ist. Wenn du jetzt einen Integer hast, der ungleich 0 ist, dann gilt das als TRUE.
In jedem Schleifendurchlauf wird durch das decrement n immer kleiner. Irgendwann erreicht es 0, was als FALSE interpretiert wird. Dann endet die Schleife.
Ich ich persönlich halte diese Art jedoch für einen schlechten Stil. Ich bin ein großer Freund von klaren booleschen Vergleichen, da dann auf jeden Fall klar ist was geschieht.
Das letzte n=n-1 steht ja außerhalb der Schleife. Es hat damit zwar keinen Einfluss auf die Schleife, wohl aber auf n. Das hat nach dem Befehl eben den Wert -1 und nicht mehr 0.
In C++ ist eine Bedingung auch dann wahr, wenn sie eine positive Zahl darstellt, also ergibt 10 als bool gespeichert den Wert true.
Es wird also in dem Sinne geprüft, ob n größer als Null ist und dann wird n dekrementiert.
while(n--){...}
Hier ist das Dekrement hinter der Variable, also wird erst der Wert zurückgegeben und dann wird die Variable dekrementiert.
Das ist aber sehr unschöner Stil, hier würde man professionell eher eine for-Schleife verwenden oder die Variable am Ende der Schleife dekrementieren und in der Bedingung überprüfen, ob n > 0 ist.
while(n > 0){ ... n--; }
oder
for(; n > 0; n--){ ... }
Beides ist möglich, aber ein while(n--) ist wirklich unschön - zwar kurz, aber nicht sehr verständlich.
LG Willibergi
Mit C hatte ich schon seit zwei Ewigkeiten nicht mehr zu tun (in der Informationstheorie gelten 10 Jahre als eine Ewigkeit), aber while(i--) (und noch mehr while(t=s[i++])) ist mir noch sehr geläufig. (Allerdings hatte so was noch sehr viel Sinn, als 1 KiB RAM noch 10 DM kostete.)
Ja - wie gesagt, so etwas funktioniert zwar prinzipiell und ist kurz, aber entspricht (zumindest heute) keinem guten Programmierstil.
Ein Inkrement oder Dekrement ist in Zuweisungen, Bedingungen, etc. immer unschön, der Quelltext ist einfach nicht sehr verständlich und man übersieht so etwas schnell.
Die Algorithmus mag vielleicht einen Tick schneller laufen, aber in heutigen Zeiten ist so eine Optimierung mittlerweile redundant.
ok alles klar danke für die Tipps :) das letzte n = n-1; der äquivalenten while schleife hat dann in diesem Fall gar keine Funktion mehr richtig ?
Naja doch, eigentlich schon.
n wird halt nach der Schleife nochmal um 1 vermindert, aber da du es danach nicht mehr verwendest oder ausgibst, bekommst du davon nichts mit.
Und while(n) ist solange wahr bis n = 0 ist.
ja genau so meinte ich das ja auch in diesem Fall, wenn man es weiter verwenden wollen würde, dann müsste man das natürlich berücksichtigen ^^
Spaßig wird es, wenn n ein float ist und man n-=0.1 nimmt - dann wundert man sich über eine Endlosschleife und korrumpierten Speicher.
Die Schleife wird so lange durchlaufen bis n ungleich Null ist.
du meinst bis n gleich Null ist? ungleich null macht ja keinen sinn davor wird ja die eingabe 1-8 erzwungen ?
achso ok alles klar diese info fehlte mir, aber dieses letzte n= n-1; der äquivalenten schleife hat dann in diesem fall gar keine funktion mehr richtig? also auf das was ausgegeben wird meine ich