Paul: Zähler in Schleifen hochzählen

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

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

    --
    Das einzige Problem beim Nichtstun: Man weiß nie, wann man damit fertig ist.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. 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)
      
      1. 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

        --
        Wer im Glashaus sitzt, sollte Spaß am Fensterputzen haben.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Vielen Dank, ich glaub ich hab's verstanden :-)

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