Pre- oder Post-Inkrementierung bei for-Schleifen?



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



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


Anmelden zum Antworten