Gibt es einen Unterschied in ++i
y i++
in einem for
Schleife? Ist es einfach eine Sache der Syntax?
Antworten
Zu viele Anzeigen?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;
}
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.
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 .
Um zu verstehen, was ein FÜR Schleife tut
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 :
Das erste Argument von FÜR (int i) wird außerhalb, vor der Schleife, ausgeführt.
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.
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