Pre- oder Post-Inkrementierung bei for-Schleifen?


  • Mod

    Wieder mal ein schönes Beispiel dafür, dass die Länge einer Diskussion umgekehrt proportional zu deren Bedeutung ist.



  • camper schrieb:

    Wieder mal ein schönes Beispiel dafür, dass die Länge einer Diskussion umgekehrt proportional zu deren Bedeutung ist.

    👍



  • //edit ich sags doch: iterator mit shared_ptr. Wozu?!?

    Sobald man mit etwas abstrakterem als rohem Speicher arbeitet gehts fast nicht anders. Besonders wenn man mit OS/C-Schnittstellen arbeitet hat man oft Daten, die nicht trivial kopierbar sind. Die C++-Algorithmen erfordern aber alle dass Iteratoren kopierbar sind und die Kopien auch eigenständig funktionieren.

    Simples Beispiel: Wie würdest du einen Iterator implementieren, der eine Datei zeilenweise iteriert? Ohne Interna nach außen zu ziehen?
    Prominentes Beispiel: Boost.Filesystem, der path_iterator nutzt intern boost::shared_ptr.



  • Ethon schrieb:

    Simples Beispiel: Wie würdest du einen Iterator implementieren, der eine Datei zeilenweise iteriert? Ohne Interna nach außen zu ziehen?
    Prominentes Beispiel: Boost.Filesystem, der path_iterator nutzt intern boost::shared_ptr.

    Hmm stimmt. An virtuelle Objekte (im Sinne von: nicht wirklich vorhanden) habe ich da nicht gedacht. Ich würde aber auch in dem Fall behaupten, dass die Operationen die mit den Iteratoren stattfinden an sich schon so teuer sind, dass man auch in dem Fall mit Messungen keinen Unterschied feststellen würde.

    Die Frage bei so etwas ist: ist das Aufwand/Nutzen Verhältnis hoch genug, als dass man in irgendeinem Coding Standard schreiben müsste: "übrigens, wir verwenden nur pre-increment in for-Schleifen". So etwas muss umgesetzt und durchgesetzt werden. Und in 99% der Fälle macht die Unterscheidung keinen Unterschied(in meinem Projekt exakt 100%). Da würde ich jetzt auch keinem Anfänger sagen: "++i ist besser", nur damit er dann bei jeder for-schleife anfängt nachzudenken, welche Version denn nun nochmal die Schnellere war. Die Wahrscheinlichkeit ist hoch, dass es a) egal ist und b) die Aufmerksamkeit nur von viel schlimmeren Fehlern geklaut wird.



  • Das ist halt so eine Sache, zu der es ein ganzes Spektrum von Standpunkten gibt.
    <- "Pre als default verpflichtend im Firmenstyleguide."(1) <-> "Pre für mich persönlich als default, weil ich dann weniger nachdenken muss."(2) <-> "Ganz egal."(3) <-> "Post als Default weils für mich semantisch irgendwas aussagt."(4) ->
    Dass du gegen 1 argumentierst bedeutet natürlich nicht, dass du für 4 bist. Ich steh bei 2, und du?

    Edit: Ah, jetzt hab ichs, glaub ich. Selbst wenn du beispielsweise bei 2 stündest, könntest du einen Anfänger ja trotzdem damit verschonen. Ich würd in einem Tutorial oder so vermutlich die Postfix-Variante erstmal gar nicht (bzw. nur als Anmerkung) erwähnen und einfach überall Prefix benutzen. Das sollte für den Neuling dann recht einfach sein und auch die, die sich mit komplexeren Iteratoren auskennen (und den von dir erklärten Optimierungen nicht immer trauen, oder es einfach auch schon ohne Optimierung optimal haben wollen), nicht stören. 🙂



  • @Dobi:
    Also erstmal fehlt mir ein Punkt "post für mich als Default weil ich keinen Grund sehe mich umzugewöhnen" (3.5), und dann ist (4) auch noch nicht das Gegenstück zu (1).
    Also "Post als default verpflichtend im Firmenstyleguide." (5)

    Ich = (3.5)



  • camper++ schrieb:

    camper schrieb:

    Wieder mal ein schönes Beispiel dafür, dass die Länge einer Diskussion umgekehrt proportional zu deren Bedeutung ist.

    👍

    👍

    Japp. Sieht man schon an ALLEN laengeren Threads im RudP. Und wenn Kleinkinder wie Pi und Hacker mitposten, sinkt das Niveau rapide gegen Null.



  • Kommt es nicht auch darauf an wo man i++/++i benutzten will ?Jenachdem kann man das dann benutzen wie man will.



  • 7xCore schrieb:

    Kommt es nicht auch darauf an wo man i++/++i benutzten will ?Jenachdem kann man das dann benutzen wie man will.

    Ja natürlich, immerhin sind es 2 unterschiedliche Operatoren. Immer den Prefix-Operator zu benutzen ist doch nur darauf bezogen, wenn du für den zurückgegebenen Wert überhaupt gar keine Verwendung hast.



  • Kein einziger von euch hat verstanden, worauf ich eigentlich hinaus will, obwohl es doch so offensichtlich ist. Wenn man i++ sieht, sollte der erste Gedanke sein "Wofür wird hier der Rückgabewert gebraucht". Zumindest bei mir ist das so. Wenn ihr nicht so denkt, ist das euer Fehler.

    Ich freue mich schon auf Flames ala "Du siehst deine Meinung als einzig richtige an blafu", aber ist nunmal so, dass meine die einzig logisch sinnvolle und begründbare ist.



  • 314159265358979 schrieb:

    Wenn man i++ sieht, sollte der erste Gedanke sein "Wofür wird hier der Rückgabewert gebraucht". Zumindest bei mir ist das so. Wenn ihr nicht so denkt, ist das euer Fehler.

    Ersetze "Fehler" durch "Problem", dann ist die Aussage nicht verfänglich. So klingt sie arrogant. Durch solche Schnitzer ziehst du die Flamewars magisch an.

    Wenn ich "i++" oder "++i" sehe, ist mein erster Gedanke "hier wird inkrementiert". Das ist die primäre Aufgabe. Und auch wenn "++i" eine nette Angewohnheit ist, ist deshalb "i++" nicht böse.



  • Was ist dan der Aussage von PI arrogant?Das einzige was an ihr ist, ist das sie stimmt ?!



  • 314159265358979 schrieb:

    Wenn man i++ sieht, sollte der erste Gedanke sein "Wofür wird hier der Rückgabewert gebraucht". Zumindest bei mir ist das so. Wenn ihr nicht so denkt, ist das euer Fehler.

    Ich denke immer: Warum pre-inc, warum post-inc? Weil: Einen Wert geben ja beide zurück. Aber laut Deiner Definition ist das ja fehlerhaft und ich wälze mich jetzt erst mal demütig im Dreck.



  • @hustbaer: Hab ja extra "Spektrum" gesagt. Davon konnte ich natürlich nur einige Punkte rausschreiben, nicht alle. Und er Pfeil ging ja auch nach rechts noch weiter. 😉

    @7xCore: Selbst wenn etwas stimmt, gibt es ja unterschiedliche Nettigkeitsstufen in der Ausdrucksweise. 🙂



  • 314159265358979 schrieb:

    Ich freue mich schon auf Flames ala "Du siehst deine Meinung als einzig richtige an blafu", aber ist nunmal so, dass meine die einzig logisch sinnvolle und begründbare ist.

    Nein. Du sagst A weil A. Das ist nicht logisch Begründet.
    Ich stimme dir zwar zu, dass ++i immer i++ vorzuziehen ist - aber das bedeutet nicht dass i++ logisch anders gelesen wird.

    Natürlich kann man jetzt argumentieren dass ++i ja immer besser ist und somit i++ wenn es denn vorkommt einen gewissen Sinn haben muss. Aber das ganze kann man umdrehen: immer i++ verwenden weils eh egal und somit muss, wenn ich denn plötzlich mal ein ++i sehe hier der Rückgabewert eine wichtige Rolle spielen.

    So lässt sich für beides argumentieren.



  • dieeinzigwahremeinung schrieb:

    314159265358979 schrieb:

    Wenn man i++ sieht, sollte der erste Gedanke sein "Wofür wird hier der Rückgabewert gebraucht". Zumindest bei mir ist das so. Wenn ihr nicht so denkt, ist das euer Fehler.

    Ich denke immer: Warum pre-inc, warum post-inc? Weil: Einen Wert geben ja beide zurück. Aber laut Deiner Definition ist das ja fehlerhaft und ich wälze mich jetzt erst mal demütig im Dreck.

    Aber i++ evaluiert im Ausdruck mit i und nach der Anweisung mit i+1, während ++i im Ausdruck und nach der Anweisung mit i+1 evaluieren - weiß du wie gut man Anfänger damit verwirren kann, dass man Code schreibt, der gezielt Eigenschafte des post-inc einsetzt? Ja kann man, eh geht doch nicht! 😃



  • 7xCore schrieb:

    Was ist dan der Aussage von PI arrogant?

    Dass es ein Fehler ist, wenn man nicht seiner Meinung ist.

    Das einzige was an ihr ist, ist das sie stimmt ?!

    Und das ist genau so arrogant, weil sie absolut ist, und keinen Raum für Diskussion lässt.

    PI hat ja als erstes eingeworfen "es zählt, was das Konstrukt ausdrücken soll". Und primär drückt sowohl "++i" als auch "i++" aus "erhöhe i um eins". Der Rest fällt bös gesagt unter Nebeneffekt, wenngleich er hier nicht ganz so unbedeutend ist. Nach PIs Darstellung erhöht ++i nur, i++ erhöht und gibt das alte i zurück - dass ++i auch etwas zurückgibt scheint für ihn Nebensache.



  • Zeus schrieb:

    Aber i++ evaluiert im Ausdruck mit i und nach der Anweisung mit i+1, während ++i im Ausdruck und nach der Anweisung mit i+1 evaluieren

    Es geht hier - wie schon mehrmals erwähnt wurde - um das alleinstehende Inkrementieren. In den anderen Fällen ist doch schon durch den Kontext die Wahl von Prä- oder Postinkrement fest vorgegeben.



  • 7xCore schrieb:

    Was ist dan der Aussage von PI arrogant?Das einzige was an ihr ist, ist das sie stimmt ?!

    Er sieht seine Meinung als das Mass aller Dinge.
    Er setzt "nicht einer Meinung mit ihm sein" mit "ihn nicht verstanden haben" gleich.
    Ne, natürlich gar nicht arrogant.



  • @Zeus: Das ist mir schon klar. Ich wollte nur darauf hinaus, dass '"Wofür wird hier der Rückgabewert gebraucht"' für beide Operatoren gilt, was PI's Aussage nutzlos macht.

    Und jetzt halte ich mich aus der Diskussion lieber raus, weil die zu nichts Sinnvollem mehr führt.


Anmelden zum Antworten