Pre- oder Post-Inkrementierung bei for-Schleifen?
-
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.
-
Schon klar, vom AUFWAND her ist es ein Unterschied, nicht aber von dem, was es ausdrückt ...
i++;
++i;Beides bedeutet: Inkrementiere i, wie Du das machst, ist mir wurscht und der Rückgabewert interessiert mich nicht.
-
Nicht um den heißen Brei herumreden. ++i ist, gerade bei größeren Klassen, performanter. Das muss man sich angewöhnen. An sich hast du Recht, also ;++i; und ;i++; macht keinen Unterschied für den Wert der Variablen.
-
Was meinst du mit "größeren Klassen"? Bei integralen Datentypen dürfte der erzeugte Maschinencode selbst ohne Optimierungen derselbe sein.
Wie das bei Iteratoren aussieht, steht auf einem anderen Blatt - der Opening Post bezog sich zunächst nur auf ints.