unterschied zwischen prä und postfix incrementor in for-schleifen



  • Wo liegt der Unterschied zwischen

    for(vector<Dorf>::size_type st = 0; st != fremd.size(); ++st)

    und

    for(vector<Dorf>::size_type st = 0; st != fremd.size(); st++)

    in wie fern verändert das benutzen eines präfix incrementor die schleifendurchläufe?

    danke für die Hilfe.



  • Im Grunde: Gar nicht.
    Bei dem Postfix wird noch ein temporäres Objekt angelegt das sofort wieder verfällt. Wenn es sich allerdings um überschrieben Operatoren von Klassen etc handelt, kann es schon komplexer werden. Der Präfix ist an der Stelle einfach sinnvoller.



  • ++++i
    

    geht.

    i++++
    

    nicht 🙂


  • Administrator

    Kóyaánasqatsi schrieb:

    ++++i
    

    geht.

    i++++
    

    nicht 🙂

    Unsinn:

    struct Works
    {
      Works operator ++(int) const
      {
        return *this;
      }
    };
    
    int main()
    {
      Works i;
    
      i++++;
    
      return 0;
    }
    

    Kompiliert einwandfrei.

    @Jud4s,
    Wie es grundsätzlich Fellhuhn gesagt hat. In vielen Bücher wird leider i++ verwendet, wodurch sich das ziemlich durchgesetzt hat. Aber grundsätzlich ist die Anweisung bescheuert, da man das temporäre alte Objekt gar nicht benötigt und daher ++i deutlich sinnvoller ist. Bei einem fundamentalen Typ spielt das keine grosse Rolle, auch nicht bei grösseren Typen ohne Nebeneffekten, da der Kompiler dies im Normalfall einfach wegoptimieren kann. Aber man sollte sich halt angewöhnen die Operation aufzurufen, welche man auch wirklich will, denn sobald es Nebeneffekte gibt, verschwendest du unnötig Ressourcen.

    Grüssli



  • und hier noch ein kleiner Link aus der FAQ
    [url=http://www.c-plusplus.net/forum/viewtopic-var-t-is-39454.html]wieso ist ++i schneller als i++, was ist der unterschied, wie überlade ich sie
    [/url]



  • Dravere schrieb:

    Kóyaánasqatsi schrieb:

    ++++i
    

    geht.

    i++++
    

    nicht 🙂

    Unsinn:

    struct Works
    {
      Works operator ++(int) const
      {
        return *this;
      }
    };
    
    int main()
    {
      Works i;
    
      i++++;
    
      return 0;
    }
    

    Kompiliert einwandfrei.

    Nicht schlecht, bist ja nen richtiger Tricks0r^^



  • Man sollte halt nicht erwarten (wenn der Operator auch noch was tut), dass dasselbe Objekt zweimal inkrementiert wird. Es wird einmal das ursprüngliche und einmal das beim ersten ++ entstandene temporäre Objekt inkrementiert.
    Das ist nur unwesentlich besser als "funktioniert nicht", wenn überhaupt.


Anmelden zum Antworten