Zähler in Schleifen hochzählen
Paul
- programmiertechnik
4 Der Martin
0 Paul0 Der Martin
0 Paul
0 Bademeister
Moin,
ich stoße immer wieder auf Schleifen in denen ein Zähler hochgezählt wird.
Manchmal passiert das mit i++ und manchmal mit ++i.
Wo liegt der Unterschied (hoffe es gibt einen der nicht sprachenabhängig ist).
Danke,
Paul
Hallo,
ich stoße immer wieder auf Schleifen in denen ein Zähler hochgezählt wird.
Manchmal passiert das mit i++ und manchmal mit ++i.
Wo liegt der Unterschied (hoffe es gibt einen der nicht sprachenabhängig ist).
solange das Erhöhen der Zählvariablen die einzige Operation ist, besteht kein Unterschied.
Technisch korrekt nennt sich das eine Pre-Increment (++i) oder Prefix-Operator, das andere Post-Increment (i++) oder Postfix-Operator.
Der Unterschied zeigt sich erst, wenn das Erhöhen Teil eines komplexeren Ausdrucks ist.
Ein ganz einfaches Beispiel.
Pre-Increment:
var i=0;
var e = ++i;
Beim Pre-Increment wird *zuerst* der Variablenwert erhöht und *dann* für die weitere Verarbeitung ausgelesen. Im vorigen Beispiel hätte e nach diesen beiden Zeilen den Wert 1, denn der Wert von i wurde erst erhöht, dann an e zugewiesen.
Post-Increment:
var i=0;
var e = i++;
Beim Pre-Increment wird dagegen *zuerst* der Variablenwert gelesen und für den umgebenden Ausdruck verwendet, *dann* erst erhöht und zurückgeschrieben. Hier hätte e nach diesen beiden Zeilen den Wert 0, denn der Wert von i wurde erst ausgelesen und zugewiesen, dann erhöht.
Alle Klarheiten beseitigt? ;-)
Ciao,
Martin
Post-Increment:
var i=0;
var e = i++;
> Hier hätte e nach diesen beiden Zeilen den Wert 0, denn der Wert von i wurde erst ausgelesen und zugewiesen, dann erhöht.
Also würde eine Ausgabe von i nach den beiden Zeilen aber 1 haben, oder?
Macht das dann für die folgenden Beispiele ein Unterschied ?-(
for(var i=0;i<abc;i++)
for(var i=0;i<abc;++i)
Hallo,
Also würde eine Ausgabe von i nach den beiden Zeilen aber 1 haben, oder?
ja, der Wert von i ist nach Ausführung beider Beispiele gleich, denn i wird ja in beiden Fällen um 1 erhöht. Der Unterschied liegt, wie gesagt, nur in der Reihenfolge. Das ist so, als wenn ich
a) erst ein Kalenderblatt abreiße, dann das Datum ablese (Pre-Increment)
b) erst das Kalenderdatum laut vorlese, dann ein Blatt abreiße (Post-Increment)
Der Zustand des Kalenders ist danach in beiden Fällen gleich, nur das vorgelesene Datum ist unterschiedlich.
Macht das dann für die folgenden Beispiele ein Unterschied ?-(
for(var i=0;i<abc;i++)
for(var i=0;i<abc;++i)
Nein. Auch hier ist ja i++ oder ++i nur eine einzelne Operation, da gibt's keine Reihenfolge, die eine Rolle spielen könnte. Das entspricht dem Abreißen des Kalenderblatts ohne Ablesen.
Ciao,
Martin
Vielen Dank, ich glaub ich hab's verstanden :-)
Hi Paul.
Da möchte ich Dir als Ergänzung zu Martins Beispiel noch Lektüre ans Herz legen, die im Falle von PHP das Thema behandelt:
Der Unterschied zwischen '$i++' und '++$i' ist der Wert der Ausdrücke.
Viele Grüße,
der Bademeister