[C/C++] Richtig inkrementieren (i++ vs. ++i)

Dieses Thema im Forum "Programmier Tutorials" wurde erstellt von ChrisWF, 25. Oktober 2008 .

Schlagworte:
  1. 25. Oktober 2008
    Richtig inkrementieren (i++ vs. ++i)

    Die meisten (gängigen) Programmiersprachen besitzen einen In(und De-)krement-Operator "++"(und "--").
    Im Code gibt es dazu zwei Schreibweisen mit unterschiedlichen Auswirkungen:
    Code:
    int i = 0;
    cout << i++;
    cout << ++i;
    Die Inkrementoren(also "++") haben also, wie man im Beispiel sieht, auch einen Rückgabewert. Beide erhöhen i um Eins, jedoch gibt i++ den alten Wert zurück, während ++i den neuen Wert liefert.
    Man kann sich beide Formen als Funktionen vorstellen:
    Code:
    int increment_before(int& i) // ++i
    {
     i = i+1;
     return i;
    }
    // und
    int increment_after(int& i) // i++
    {
     int temp= i; // Den alten Wert sichern
     i = i+1;
     return temp;
    }
    Damit wäre das Grundlegende schon mal geklärt.

    Nun verwendet man i++/++i wohl am Häufigsten in for-Schleifen. Dafür muss i auch kein Integer sein, es kann z.B. auch ein Iterator sein:
    Code:
    std::vector<int> integerVector;
    // Vektor mit Werten füllen
    std::vector<int>::iterator i = integerVector.begin();
    for ( ; i != integerVector.end(); ++i)
    {
     // Mache irgendwas mit dem aktuellen Element, z.B.
     cout << (*i) << endl;
    }
    
    Vielleicht ist jemandem aufgefallen, dass ich "++i" gewählt habe - das hat einen Grund. Man sollte immer, wenn man den Rückgabewert eines Inkrementors nicht braucht(wie z.B. bei einer for-Schleife), "++i" verwenden!
    Bei einfachen Integern ist das jetzt noch nicht so relevant, aber bei Iteratoren oder anderen Klassen, für die man vielleicht den ++-Operator überschrieben hat, macht es es einen merkbaren Unterschied.
    Dazu schauen wir uns wieder mal zwei Ersatz-Funktionen an:
    Code:
    MyClass increment_before(MyClass& k) // ++k
    {
     //Erhöhen von k
     return k;
    }
    // und
    MyClass increment_after(MyClass& k) // k++
    {
     MyClass temp = MyClass(k); // Den alten Wert sichern
     //Erhöhen von k
     return temp;
    }
    Da wir es hier mit Objekten zu tun haben, muss im zweiten Fall eine Objektkopie erstellt werden, die aber im Endeffekt gar nicht benötigt wird.

    Also merken: Will man nur 'hochzählen', nimmt man "++i"!


    Zum Abschluss vielleicht noch ein kleines Quiz:
    Code:
    int i = 1;
    i += i++ + ++i;
    
    Welchen Wert hat i anschließend?
    Spoiler
    Sieben - aber nur unter C/C++/php.
    Wenn du 5 getippt/errechnet hast, bist du höchstwahrscheinlich ein Java/.Net-Coder
    Aufschlüsselung:
    Code:
    i += i++ + ++i; // (i ist 1)
    i += 1 + ++i; // (i ist 2)
    i += 1 + 3; // (i ist 3)
    i = 3 + 1 + 3; // --> 7
    
    Diesen letzten Schritt machen die anderen Sprachen zuerst, also wenn i noch 1 ist. (1 + 1 + 3 = 5)

    ----
    Quellen: why i++ instead of ++i in for loops - C / C++ und http://karma.nucleuscms.org/index.php/item/107
     
    1 Person gefällt das.
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.