352 Stimmen

Unterschied zwischen Vorinkrement und Nachinkrement in einer Schleife?

Gibt es einen Unterschied in ++i y i++ in einem for Schleife? Ist es einfach eine Sache der Syntax?

4voto

Tanveer Badar Punkte 4934

Bei ++i und i++ geht es um mehr als Schleifen und Leistungsunterschiede. ++i liefert einen l-Wert und i++ einen r-Wert. Ausgehend davon gibt es viele Dinge, die Sie mit ++i, nicht aber mit i++ machen können.

1- It is illegal to take the address of post increment result. Compiler won't even allow you.
2- Only constant references to post increment can exist, i.e., of the form const T&.
3- You cannot apply another post increment or decrement to the result of i++, i.e., there is no such thing as I++++. This would be parsed as ( i ++ ) ++ which is illegal.
4- When overloading pre-/post-increment and decrement operators, programmers are encouraged to define post- increment/decrement operators like:

T& operator ++ ( )
{
   // logical increment
   return *this;
}

const T operator ++ ( int )
{
    T temp( *this );
    ++*this;
    return temp;
}

3voto

Mont Pierce Punkte 131

Es ist mir ein Rätsel, warum so viele Leute den Inkrement-Ausdruck in der for-Schleife als i++ schreiben.

In einer for-Schleife, wenn die 3. Komponente eine einfache Inkrement-Anweisung ist, wie in

for (i=0; i<x; i++)  

oder

for (i=0; i<x; ++i)   

gibt es keinen Unterschied in den daraus resultierenden Ausführungen.

2voto

xaddict Punkte 1259

In javascript aufgrund der folgenden i + kann besser sein, zu verwenden:

var i=1;
alert(i++); // before, 1. current, 1. after, 2.
alert(i); // before, 2. current, 2. after, 2.
alert(++i); // before, 2. current, 3 after, 3.

Während Arrays (ich glaube alle) und einige andere Funktionen und Aufrufe 0 als Startpunkt verwenden, müssen Sie i auf -1 setzen, damit die Schleife mit dem Array funktioniert, wenn Sie ++i .

Bei der Verwendung von i++ wird für den folgenden Wert der erhöhte Wert verwendet. Sie könnten sagen i++ ist die Art, wie Menschen zählen, denn man kann mit einer 0 .

2voto

Dogkiller87 Punkte 485

Um zu verstehen, was ein FÜR Schleife tut

enter image description here

Das Bild oben zeigt, dass FÜR kann umgewandelt werden in WHILE da sie letztendlich denselben Assemblercode haben (zumindest in gcc). Wir können also aufschlüsseln FÜR in mehrere Teile zu zerlegen, um zu verstehen, was es bewirkt.

for (i = 0; i < 5; ++i) {
  DoSomethingA();
  DoSomethingB();
}

ist gleich dem WHILE Version

i = 0; //first argument (a statement) of for
while (i < 5 /*second argument (a condition) of for*/) {
  DoSomethingA();
  DoSomethingB();
  ++i; //third argument (another statement) of for
}

Das bedeutet, dass Sie Folgendes verwenden können FÜR als eine einfache Version von WHILE :

  1. Das erste Argument von FÜR (int i) wird außerhalb, vor der Schleife, ausgeführt.

  2. Das dritte Argument von FÜR (i++ oder ++i) ausgeführt wird, in der letzte Zeile der Schleife.

TL:DR: egal ob i++ o ++i Wir wissen, dass sie, wenn sie allein stehen, nichts bewirken, sondern nur +1 für sich selbst.

In der Schule wird normalerweise die i++ Methode gelehrt, aber es gibt auch viele Menschen, die die ++i Methode bevorzugen, weil mehrere Gründe .

HINWEIS: In der Vergangenheit hatte i++ nur sehr geringe Auswirkungen auf die Leistung, da es nicht nur von sich aus plus eins macht, sondern auch den ursprünglichen Wert im Register behält. Aber im Moment macht es keinen Unterschied, da der Compiler den Plus-Eins-Teil gleich macht.

2voto

crashmstr Punkte 27437

Als @Jon B sagt, dass es keinen Unterschied in einer for-Schleife gibt.

Aber in einem while o do...while Schleife, könnten Sie einige Unterschiede feststellen, wenn Sie einen Vergleich mit der ++i o i++

while(i++ < 10) { ... } //compare then increment

while(++i < 10) { ... } //increment then compare

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X