While Schleife mit Dekrement verstehen?

while - (Computer, PC, programmieren)

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.


RealAutism 
Fragesteller
 05.03.2017, 20:28

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

0
ohwehohach  05.03.2017, 20:34
@RealAutism

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.

1

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


RealAutism 
Fragesteller
 05.03.2017, 20:31

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 ?

0
Willibergi  05.03.2017, 20:33
@RealAutism

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.

1
RealAutism 
Fragesteller
 05.03.2017, 20:36
@Willibergi

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 ^^

1
PWolff  05.03.2017, 20:59
@Willibergi

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.

2
PWolff  05.03.2017, 20:58

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.)

3
Willibergi  05.03.2017, 21:01
@PWolff

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.

2

Die Schleife wird so lange durchlaufen bis n ungleich Null ist.


RealAutism 
Fragesteller
 05.03.2017, 20:24

du meinst bis n gleich Null ist? ungleich null macht ja keinen sinn davor wird ja die eingabe 1-8 erzwungen ?

1
ohwehohach  05.03.2017, 20:26

Nein. Die Schleife wird solange durchlaufen, bis noch gleich 0 ist.

0
softie1962  05.03.2017, 20:27

ersetze "bis" durch "wie"

1