Pre- oder Post-Inkrementierung bei for-Schleifen?
-
Oft sehe ich die for-Schlafe mal
for(int i = 0; i < 5; i++) { cout << "Post: " << i << endl; }
und auch oft mal so
for(int i = 0; i < 5; ++i) { cout << "Pre: " << i << endl; }
Die Aussage auf der Console ist absolut die gleiche. Warum verwenden manche
++i
und mache wiederrumi++
?
-
Die i++-ler sind die, die den Code beim Lernen der Sprache von Leuten übernommen haben, die ihn von Leuten übernommen haben, die ihn von C-lern übernommen haben.
Die ++i-ler sind die Leute, die das Programmieren verstanden haben.
-
bei integern macht es keinen unterschied.
Aber bei c++ gibt es operatorüberladung. Und wenn man dann eine benutzerdefinierte klasse nimmt, wird beim post-inkrement noch eine unnötige kopie erzeugt.
Es macht praktisch fast keinen unterschied, aber da es fälle gibt, bei denen das pre-inkrement schneller ist, schreibe ich bei for-schleifen immer ++i
++i heißt erhöhe i und gebe den erhöhten wert zurück.
i++ heißt erstelle eine kopie von i, erhöhe dann i und gebe die kopie zurück.
-
Bei Integern egal, aber wenn i ein Iterator wäre, wäre ++i schneller, weil er bei i++ eine Kopie erstellen müsste, den internen Zeiger inkrementieren, und dann die Kopie zurückgeben. Bei ++i inkrementiert er nur den internen Zeiger und gibt *this zurück.
-
Danke.
-
Das war jetzt dreimal fast dieselbe Erklärung, hoffentlich hast es auch verstanden ^^
-
Die viel wichtigere Begründung ist Ausdruck. Damit meine ich, was der Code auf den Leser ausdrückt. ++i drückt aus "erhöhe um 1". i++ drückt aus "erhöhe um 1 und gib mir den Wert vor der erhöhung, weil ich diesen noch brauche". Damit sollte auch klar sein, warum man ++i verwenden sollte.
-
314159265358979 schrieb:
Die viel wichtigere Begründung ist Ausdruck. Damit meine ich, was der Code auf den Leser ausdrückt. ++i drückt aus "erhöhe um 1". i++ drückt aus "erhöhe um 1 und gib mir den Wert vor der erhöhung, weil ich diesen noch brauche". Damit sollte auch klar sein, warum man ++i verwenden sollte.
Das erscheint mir recht willkürlich. Genauso gut kann ich sagen:
i++: Erhöhe um 1.
++i: Erhöhe um 1 und gib mir den neuen Wert zurück, weil ich diesen noch brauche.
-
Edit: gelöscht.
-
Hör auf zu trollen, Michael E. Ich wette, du teilst meine Ansicht auch, willst mir aber nur eins auswischen, wie alle anderen. Versuch fehlgeschlagen.
-
Ach Pi, was würde aus dir wenn du nicht predigen könntest.
-
314159265358979 schrieb:
Hör auf zu trollen, Michael E. Ich wette, du teilst meine Ansicht auch, willst mir aber nur eins auswischen, wie alle anderen. Versuch fehlgeschlagen.
Und noch eine gewonnene Wette. Heute scheint mein Glückstag zu sein.
-
Dass es Prä- und Postinkrement gibt, hat nichts damit zu tun, was diese abstrakt aussagen sollen, sondern liegt daran, dass es in einer Zeit bevor auch nur jemand von optimierenden Compilern zu träumen wagte gut zur Architektur der PDP-7 und ihrer Nachfolger (insbesondere der PDP-11) passte.
Zeitlich bewegen wir uns hier Ende der sechziger Jahre (das kommt ja noch von B her) - die Leute waren damals schon froh, wenn sie einen Assembler hatten. In solchen Kategorien hat damals niemand gedacht.
-
314159265358979 schrieb:
Die viel wichtigere Begründung ist Ausdruck. Damit meine ich, was der Code auf den Leser ausdrückt. ++i drückt aus "erhöhe um 1". i++ drückt aus "erhöhe um 1 und gib mir den Wert vor der erhöhung, weil ich diesen noch brauche". Damit sollte auch klar sein, warum man ++i verwenden sollte.
Exakt
-
314159265358979 schrieb:
Die ++i-ler sind die Leute, die das Programmieren verstanden haben.
Die die das glauben, haben keine Ahnung vom Programmieren.
-
Es produziert denselben code. Ich schreibe ++i, weil ich cool bin.
-
*sigh*
Hört auf, euch anzugiften. Ich hab grade keine Lust, den Kindergartenmist hier rauszuoperieren. Dazu gehört auch alles in Richtung "der hat aber angefangen" und "ich hab doch garnichts gemacht" und ähnliche Sandkastenzitate.
-
seldon schrieb:
dass es in einer Zeit bevor auch nur jemand von optimierenden Compilern zu träumen wagte
So eine Zeit hat es nie gegeben. Schon der erste FORTRAN-Compiler hat optimiert, schon allein aus Akzeptanzgründen.
-
314159265358979 schrieb:
Die viel wichtigere Begründung ist Ausdruck. Damit meine ich, was der Code auf den Leser ausdrückt. ++i drückt aus "erhöhe um 1". i++ drückt aus "erhöhe um 1 und gib mir den Wert vor der erhöhung, weil ich diesen noch brauche". Damit sollte auch klar sein, warum man ++i verwenden sollte.
i++;
drückt aus: Erhöhe um eins - und ist damit identisch zu ++i (vom Ausdruck her);Erst bei zum Beispiel:
a[i++];
oder
b = i++;kommt das von Dir Gesagte zum Tragen und macht einen Unterschied zu:
a[++i];
bzw.
b = ++i;
-
Belli schrieb:
i++;
drückt aus: Erhöhe um eins - und ist damit identisch zu ++i (vom Ausdruck her);Nein. i++ bringt schon bei Integralen (wenn auch minimalen) Kopieraufwand (ist gleichzusetzten mit (++i - 1)). PI hat schon Recht, es ist üblich (und gerade, wenn die Inkrementierung in nur einer Anweisung steht), das Präfix zu nehmen.