Vollständige Version anzeigen : [C/C++] Richtig inkrementieren (i++ vs. ++i)


ChrisWF
25.10.2008, 02:05

Die meisten (gängigen) Programmiersprachen besitzen einen In(und De-)krement-Operator "++"(und "--").
Im Code gibt es dazu zwei Schreibweisen mit unterschiedlichen Auswirkungen:
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:

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:

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:

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:
int i = 1;
i += i++ + ++i;

Welchen Wert hat i anschließend?
Sieben - aber nur unter C/C++/php.
Wenn du 5 getippt/errechnet hast, bist du höchstwahrscheinlich ein Java/;Net-Coder
Aufschlüsselung:

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++ (;bytes~com/forum/thread63485;html) und (;karma;nucleuscms~org/index;php/item/107)

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Ähnliche Themen zu [C/C++] Richtig inkrementieren (i++ vs. ++i)
  • richtig formatieren?
    hallo ich habe gehört das man den pc so formartieren kann,dass von den daten die auf dem pc waren alle so gelöscht wurden und so das man auch nichts wieder finden kann. (also wenn die bullden den pc mal wegen donwloaden mitnehmen, können die nichts finden, wenn man den pc formatiert hat) stimm [...]

  • Kommasetzung so richtig?
    Moin, ich frage momentan bei einigen Unternehmen wegen Praktikumsplätzen an und bin mir bei der Kommasetzung nicht ganz sicher. "...;ich wollte mich erkundigen, ob es in Ihrem Unternehmen möglich ist ein Praktikum als Industriekaufmann im Zeitraum vom 18;01 - 12;02;2010 durchzuführen;" und [...]

  • Ps2 Emu richtig einstellen
    Ej Leute könnte ihr mir Helfen. Ich will aus meinen Ps2 Emulator das beste raushollen da ich mich aber nicht so Auskenne wollte ich euch mal fragen wie ich den einstelle damit das meiste raus kommt. Hier ein paar daten über meinen Rechner damit ih mir sagen könnt wie ich den ein besten einstellet [...]

  • Richtig richtig große brushes
    Hallo ich suche sehr sehr große brushes vektor vor allem ich bin gerade darauf gekommen dass ich gar keine richtig großen bilder machen kann weil die brushes dann entweder extremst verpixelt sind oder man kann sie erst gar nicht so vergrößern. Ich denke dabei an größen wie Din A2 (Plak [...]



raid-rush.ws | Imprint & Contact pr