Pre- oder Post-Inkrementierung bei for-Schleifen?



  • 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.



  • Hacker schrieb:

    Nicht um den heißen Brei herumreden.

    Wer redet um den heißen Brei? Schon die erste seriöse Antwort hat die Performance erwähnt und es ist seitdem dauernd wiederholt worden. Komischerweise stimmst du mit Belli überein und willst ihm trotzdem widersprechen 😕

    Edit: Achja:

    i++ bringt schon bei Integralen (wenn auch minimalen) Kopieraufwand (ist gleichzusetzten mit (++i - 1)).

    stimmt nicht.



  • Hacker schrieb:

    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)).

    NEIN!

    PI hat schon Recht, es ist üblich (und gerade, wenn die Inkrementierung in nur einer Anweisung steht), das Präfix zu nehmen.

    Auja, immer lustig wenn die Kids einem sagen was üblich ist.
    Alter Schwede, wie kann man nur so von sich eingenommen sein.

    Leute, Newsflash: üblich ist i++!
    Wer was anderes glaubt lebt in einer Traumwelt.



  • Aber wen juckts wenns aufs selbe hinausläuft?
    Weil für mich code spricht, ist ++i zu bevorzugen wenn nur ein Wert, i, gebraucht wird, und i++ wenn zwei Werte, i und i + 1, gebraucht werden. Wer es nicht so hält wird trotzdem glücklich, Leute.

    Edit: Wir sollten lieber 3 Seiten threads über den letzten ineffizienten Algorithmus haben, den wir so verbrochen haben, nicht ob man prä oder postfix inkrementiert.



  • 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.

    Nach der Erklärung isses bei der Schleife doch egal, weil der zurückgegebene Wert interessiert in diesem Fall nicht 😕



  • Mit Iteratoren ist Prefix schneller, also kann man es sich schon angewöhnen diesen in einer for-Schleife zu verwenden.



  • hustbaer schrieb:

    Leute, Newsflash: üblich ist i++!
    Wer was anderes glaubt lebt in einer Traumwelt.

    Kann ich aus meiner Erfahrung nicht bestätigen. Im jüngeren Code hier bei uns in der Firma sieht man das Postinkrement eigentlich nur noch wenns wirklich so benötigt wird, also sehr selten. Dann hab ich gerade mal in Effective C++ 3rd ed. und C++ Templates the complete guide geblättert bis ich auf das erste Inkrement gestoßen bin. Bei Meyers war das erste, das ich sah, Item 29 "++imageChanges;" und im anderen wars auf Seite 37 "++numElems;", also auch beides Prefix.
    Auch wenn in anderem code Prefix vielleicht nicht üblig ist, halte ich es schon für sinnvoll, das für sich selbst erstmal als Default zu nehmen und es so einfach üblich zu machen, weil es eigentlich nie schlechter sein sollte, dafür aber manchmal besser ist. Und bei Template-Kram weiß man ja eh nicht mehr, was man da gerade überhaupt erhöht. 😉



  • Hacker schrieb:

    Nicht um den heißen Brei herumreden. ++i ist, gerade bei größeren Klassen, performanter.

    Das musst du mir erst mal durch Messungen beweisen. Und ich Wette mit dir, dass wenn du einen Fall findest bei dem das wirklich zutrifft, die Klasse noch ganz andere Probleme hat.

    Gegenhypothese: es macht absolut 0 Unterschied, solange der Typ etwas so anspruchvolles wie ein iterator ist.



  • otze schrieb:

    Hacker schrieb:

    Nicht um den heißen Brei herumreden. ++i ist, gerade bei größeren Klassen, performanter.

    Das musst du mir erst mal durch Messungen beweisen. Und ich Wette mit dir, dass wenn du einen Fall findest bei dem das wirklich zutrifft, die Klasse noch ganz andere Probleme hat.

    Gegenhypothese: es macht absolut 0 Unterschied, solange der Typ etwas so anspruchvolles wie ein iterator ist.

    Na, dann lügt Ethon schonmal. Oder du hast wahrscheinlich ein "nicht" vergessen.


Anmelden zum Antworten