En programmation, en particulier en Java, quelle est la différence entre:
int var = 0;
var++;
et
int var = 0;
++var;
Quelles répercussions cela aurait-il sur une boucle perdue?
par exemple.
for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
Bien que var++
et ++var
incrémentent la variable à laquelle ils sont appliqués, le résultat renvoyé par var++
est la valeur de la variable avant incrémentation, alors que le résultat renvoyé par ++var
est la valeur de la variable après application de l'incrément.
Lorsque ++var
ou var++
forme une instruction complète (comme dans vos exemples), il n'y a pas de différence entre les deux. Par exemple ce qui suit
int x = 6;
++x;
assert x == 7;
est identique à
int x = 6;
x++;
assert x == 7;
Toutefois, lorsque ++var
ou var++
sont utilisés dans le cadre d'une instruction plus grande, les deux peuvent ne pas être équivalents. Par exemple, l'assertion suivante passe
int x = 6;
assert ++x == 7;
alors que celui-ci échoue
int x = 6;
assert x++ == 7;
Bien que var++
et ++var
incrémentent la variable à laquelle ils sont appliqués, le résultat renvoyé par var++
est la valeur de la variable avant incrémentation, alors que le résultat renvoyé par ++var
est la valeur de la variable après application de l'incrément.
Lorsqu'il est utilisé dans une boucle for
, il n'y a pas de différence entre les deux car l'incrémentation de la variable ne fait pas partie d'une instruction plus grande. Cela peut ne pas apparaître ainsi, car il y a un autre code sur la même ligne du fichier source. Mais si vous regardez de plus près, vous verrez qu'il y a un ;
immédiatement avant l'incrément et rien après, de sorte que l'opérateur d'incrément ne fait pas partie d'une instruction plus grande.
++var
est l'opérateur de pré-incrémentation; il incrémente la valeur de var
before lors de l'évaluation de l'expression. De même, var++
est l'opérateur post-incrémentation; il incrémente la valeur de var
after en évaluant l'expression.
Dans le cas d'une boucle simple, il n'y a pas de différence entre deux, car les expressions ++var;
et var++;
donnent toutes deux le même résultat.
Pour plus d'informations, voir par exemple http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps .
int a = 5, b;
post increment : b = a++;
: a
est d'abord transféré vers b
, puis a
est incrémenté, donc maintenant b
est 5
, et a
est 6
L'effet est b = a; a = a + 1;
pre increment : b = ++a;
: first a
est incrémenté puis le résultat est transféré dans b
, donc maintenant a
est 7
et aussi b
est 7
. L'effet est a = a + 1; b = a
a++
et ++a
en restant indépendant agissent de la même manière. Dans les exemples de boucle que vous avez présentés, les opérateurs d'incrémentation ne sont associés à aucune expression et sont indépendants. Par conséquent, ces deux dans cette implémentation particulière sont identiques.
Dans vos exemples, il n'y a pas de différence, il y a cependant une différence entre:
int var = 0;
int var2 = ++var;
et:
int var = 0;
int var2 = var++;
Dans le premier cas, la valeur de var2 est 1 alors que dans le second, elle est 0.
var ++ renvoie sa valeur avant l'incrémentation.
++ var renvoie sa valeur après l’incrémentation.
int var = 0;
System.out.println(var++); // returns 0;
var = 0;
System.out.println(++var); // returns 1
++var
et var++
sont identiques lorsqu'ils apparaissent dans une expression seule . Cela s'applique à votre question car vous avez seul ++i
, i++
.
La différence ne se produit que lorsque vous les insérez:
int x = 0;
printf( "%d %d\n", ++x, x ); // 1 1
printf( "%d %d\n", x++, x ); // 1 2
Comment se souvenir?
Lorsque vous voyez commencez par connaître l'opérateur, puis incrémentez et prendra plus tard une valeur.
Lorsque vous voyez commencez par lire la variable, prenez ensuite la valeur et augmentez ensuite.
Donc, dans le premier exemple, vous voyez des valeurs égales parce que:
you increment `x`, then access `x`, then access `x` again
Donc, dans le deuxième exemple, vous voyez des différences parce que:
you access `x`, then increment `x`, then access `x` again
++ i est preincrement, il est fait avant que quoi que ce soit dans l'expression il apparaît.
i ++ est postdecrement, il est exécuté après quoi que ce soit dans l'expression, il apparaît.
dans la première boucle, vous courrez de 0 à 9. Dans la seconde, il courra de 1 à 9.
Mon conseil: évitez les deux (les exceptions peuvent être i ++; ou la première boucle). Trop difficile à chercher dans l'expression.
J'ai passé une longue journée à déboguer
myArray [(i ++)% 16] = données
et en essayant de trouver pourquoi il essayait d'écrire des données [16] parfois
En fait, c'est plutôt simple. Le préincrément ++ i est exécuté en premier dans l’instruction.
j = ++i +1;
est équivalent à
i = i+1;
j = i+1;
alors que le post-incrément i ++ est exécuté à la fin;
j = i++ +1;
est équivalent à
j = i+1;
i = i+1;