webentwicklung-frage-antwort-db.com.de

Der Unterschied zwischen ++ Var und Var ++

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) {}
65
user559142

tldr;

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.

Weitere Erklärung

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.

110
Dónal

++var ist der Pre-Increment-Operator. es erhöht den Wert von varbefore und wertet den Ausdruck aus. Ähnlich ist var++ der Nachinkrementoperator. es erhöht den Wert von varafter 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 .

13
Eser Aygün

int a = 5, b;

post inkrement : b = a++;: a wird zuerst an b übertragen und dann a wird erhöht, daher ist b5 und a6 Der Effekt ist b = a; a = a + 1;

pre inkrementieren : b = ++a;: Zuerst wird a inkrementiert und das Ergebnis in b übertragen. Daher ist a7 und auch b7. 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.

11
phoxis

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.

6
Maurice Perry

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
5

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
0
Eugen Konkov

++ 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

0
SJuan76

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;
0
Eilistraee