Was ist beim Programmieren, insbesondere in Java, der Unterschied zwischen:
int var = 0;
var++;
und
int var = 0;
++var;
Welche Auswirkungen hätte dies auf eine for-Schleife?
z.B.
for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
Obwohl sowohl var++
als auch ++var
die Variable inkrementieren, auf die sie angewendet werden, ist das von var++
zurückgegebene Ergebnis der Wert der Variablen vor dem Inkrementieren, während das von ++var
zurückgegebene Ergebnis der Wert der Variablen ist, nachdem das Inkrement angewendet wurde.
Wenn ++var
oder var++
eine vollständige Anweisung bilden (wie in Ihren Beispielen), besteht kein Unterschied zwischen den beiden. Zum Beispiel folgendes
int x = 6;
++x;
assert x == 7;
ist identisch mit
int x = 6;
x++;
assert x == 7;
Wenn jedoch ++var
oder var++
als Teil einer größeren Anweisung verwendet werden, sind die beiden möglicherweise nicht gleichwertig. Zum Beispiel wird die folgende Behauptung bestanden
int x = 6;
assert ++x == 7;
während dieser versagt
int x = 6;
assert x++ == 7;
Obwohl sowohl var++
als auch ++var
die Variable inkrementieren, auf die sie angewendet werden, ist das von var++
zurückgegebene Ergebnis der Wert der Variablen vor dem Inkrementieren, während das von ++var
zurückgegebene Ergebnis der Wert der Variablen ist, nachdem das Inkrement angewendet wurde.
Bei Verwendung in einer for
-Schleife besteht kein Unterschied zwischen den beiden, da das Inkrementieren der Variablen nicht Teil einer größeren Anweisung ist. Es wird möglicherweise nicht auf diese Weise angezeigt, da sich in derselben Zeile der Quelldatei anderer Code befindet. Wenn Sie jedoch genau hinschauen, werden Sie sehen, dass sich unmittelbar vor dem Inkrement ein ;
und nichts danach befindet, sodass der Increment-Operator nicht Teil einer größeren Anweisung ist.
++var
ist der Pre-Increment-Operator. es erhöht den Wert von var
before und wertet den Ausdruck aus. Ähnlich ist var++
der Nachinkrementoperator. es erhöht den Wert von var
after und wertet den Ausdruck aus.
Bei einer einfachen Schleife gibt es keinen Unterschied zwischen zwei, da die Ausdrücke ++var;
und var++;
zum gleichen Ergebnis führen.
Weitere Informationen finden Sie zum Beispiel http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps .
int a = 5, b;
post inkrement : b = a++;
: a
wird zuerst an b
übertragen und dann a
wird erhöht, daher ist b
5
und a
6
Der Effekt ist b = a; a = a + 1;
pre inkrementieren : b = ++a;
: Zuerst wird a
inkrementiert und das Ergebnis in b
übertragen. Daher ist a
7
und auch b
7
. Der Effekt ist a = a + 1; b = a
a++
und ++a
, die unabhängig bleiben, verhalten sich ähnlich. In den dargestellten Schleifenbeispielen sind die Inkrement-Operatoren keinem Ausdruck zugeordnet und unabhängig. Daher sind diese beiden in dieser speziellen Implementierung identisch.
In Ihren Beispielen gibt es keinen Unterschied, es gibt jedoch einen Unterschied zwischen:
int var = 0;
int var2 = ++var;
und:
int var = 0;
int var2 = var++;
Im ersten Fall ist var2 1, im zweiten 0.
var ++ gibt seinen Wert vor dem Inkrementieren zurück.
++ var gibt seinen Wert nach dem Inkrementieren zurück.
int var = 0;
System.out.println(var++); // returns 0;
var = 0;
System.out.println(++var); // returns 1
Sowohl ++var
als auch var++
sind identisch, wenn sie nur im Ausdruck angezeigt werden .. Dies gilt für Ihre Frage, da Sie allein ++i
, i++
haben.
Es gibt nur Unterschiede, wenn Sie sie inline einbinden:
int x = 0;
printf( "%d %d\n", ++x, x ); // 1 1
printf( "%d %d\n", x++, x ); // 1 2
Wie erinnerst du dich?
Wenn Sie zuerst den Operator sehen, dann erhöhen Sie und nehmen dann den Wert an.
Wenn Sie zuerst die Variable sehen, dann nehmen Sie den Wert und später inkrementieren.
Im ersten Beispiel sehen Sie also gleiche Werte, weil:
you increment `x`, then access `x`, then access `x` again
Im zweiten Beispiel sehen Sie Unterschiede, weil:
you access `x`, then increment `x`, then access `x` again
++ i ist Vorinkrement, es wird vor irgendetwas in dem Ausdruck getan, in dem es erscheint.
i ++ ist eine Nachentfernung. Es wird nach etwas in dem Ausdruck ausgeführt, in dem es erscheint.
in der ersten Schleife laufen Sie von 0 bis 9. In der zweiten von 1 bis 9.
Mein Rat: Vermeiden Sie beide (Ausnahmen können i ++ oder die erste Schleife sein). Zu schwierig für den Ausdruck zu suchen.
Ich habe einen langen Tag beim Debuggen bestanden
myArray [(i ++)% 16] = Daten
und versuchen, herauszufinden, warum es manchmal versucht hat, Daten [16] zu schreiben
In der Tat ist das ziemlich einfach. Das Preincrement ++ i wird zuerst in der Anweisung ausgeführt.
j = ++i +1;
ist äquivalent zu
i = i+1;
j = i+1;
am Ende wird das Post-Inkrement i ++ ausgeführt.
j = i++ +1;
ist äquivalent zu
j = i+1;
i = i+1;