Worin besteht in C der Unterschied zwischen der Verwendung von ++i
und i++
, und was sollte im Inkrementierungsblock einer for
-Schleife verwendet werden?
++i" erhöht den Wert von "i" und gibt dann den erhöhten Wert zurück.
i = 1;
j = ++i;
(i ist 2, j ist 2)
i++" erhöht den Wert von "i", gibt aber den ursprünglichen Wert zurück, den "i" vor der Inkrementierung hatte.
i = 1;
j = i++;
(i ist 2, j ist 1)
Für eine "for"-Schleife funktioniert beides. Die Variante "i++" scheint gebräuchlicher zu sein, vielleicht weil sie auch in K&R verwendet wird.
Befolgen Sie auf jeden Fall die Richtlinie "bevorzugen Sie ++i
gegenüber i++
" und Sie werden nichts falsch machen.
Es gibt ein paar Anmerkungen zur Effizienz von ++i
und i++
. In jedem Compiler, der nicht von Studenten entwickelt wurde, gibt es keinen Leistungsunterschied. Sie können dies überprüfen, indem Sie sich den generierten Code ansehen, der identisch sein wird.
Die Frage der Effizienz ist interessant... hier ist mein Versuch einer Antwort: https://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i
Wie On Freund bemerkt, ist es bei einem C++-Objekt anders, da operator++()
eine Funktion ist und der Compiler nicht wissen kann, dass er die Erstellung eines temporären Objekts zur Aufnahme des Zwischenwerts wegoptimieren muss.
++i" erhöht den Wert und gibt ihn dann zurück.
i++" gibt den Wert zurück und erhöht ihn anschließend.
Das ist ein feiner Unterschied.
Für eine for-Schleife sollten Sie ++i
verwenden, da es etwas schneller ist. i++
erzeugt eine zusätzliche Kopie, die einfach weggeworfen wird.
Der Grund, warum ++i
etwas schneller als i++
sein kann, ist, dass i++
eine lokale Kopie des Wertes von i benötigen kann, bevor er inkrementiert wird, während ++i
das nie tut. In einigen Fällen optimieren einige Compiler dies weg, wenn möglich... aber es ist nicht immer möglich, und nicht alle Compiler tun dies.
Ich versuche, mich nicht zu sehr auf die Optimierungen der Compiler zu verlassen, also würde ich Ryan Fox' Rat befolgen: wenn ich beides verwenden kann, verwende ich ++i
.