web-dev-qa-db-fra.com

La différence entre ++ Var et Var ++

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

tldr;

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.

Plus d'explications

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.

110
Dónal

++var est l'opérateur de pré-incrémentation; il incrémente la valeur de varbefore lors de l'évaluation de l'expression. De même, var++ est l'opérateur post-incrémentation; il incrémente la valeur de varafter 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 .

13
Eser Aygün

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.

11
phoxis

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.

6
Maurice Perry

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
5

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

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

0
SJuan76

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