Comment fonctionnent les opérateurs post-incrémentation (i ++) et pré-incrémentation (++ i) en Java?

99

Pouvez-vous m'expliquer la sortie de ce code Java?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

La sortie est de 20 dans les deux cas

Ankit Sachan
la source
9
Évitez toujours les déclarations ambiguës :)
Prasoon Saurav
9
@Prasoon Saurav Contrairement à C et C ++, Java et C # ont un ordre d'évaluation strictement défini, donc ces déclarations ne sont pas ambiguës.
Pete Kirkham
12
Je le sais, mais ces déclarations ne sont pas (ne peuvent pas être) utilisées à des fins pratiques, il faut donc l'éviter.
Prasoon Saurav
4
@PeteKirkham C'est plus de six ans plus tard, mais je tiens toujours à souligner que "ambigu", dans cette situation, est ambigu - cela pourrait signifier "le compilateur ne sait pas quoi mettre", ou cela pourrait signifier "Le programmeur n'a aucune idée de ce que cela signifie ".
Fonder le procès de Monica le

Réponses:

150

est-ce que cela aide?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

Le point principal est que ++ala valeur incrémente et la renvoie immédiatement.

a++ incrémente également la valeur (en arrière-plan) mais renvoie la valeur inchangée de la variable - ce qui semble être exécuté plus tard.

kgiannakakis
la source
5
Etes-vous sûr d'un == 9 dans le second?
Pete Kirkham
1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) puisque la post-incrémentation a la priorité la plus élevée, est-ce que a ++ est exécuté en premier?
rsirs
2
exemple compliqué à quelque chose qui est facile à expliquer.
oznus
Cette réponse est-elle la même pour c # et c ++?
workoverflow
Pourquoi a, b et c sont-ils égaux à 2 ici? int a = 1; int b = a++; int c = ++b;Je m'attendais à ce que b soit 1 car il s'agit d'un incrément de poste.
Dennis
202

++aincrémente puis utilise la variable.
a++utilise puis incrémente la variable.

Si tu as

a = 1;

et vous faites

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict explique votre extrait de code particulier.

Lombo
la source
62

Dans les deux cas, il calcule d'abord la valeur, mais en post-incrémentation, il contient l'ancienne valeur et après le calcul, la renvoie

++ un

  1. a = a + 1;
  2. return a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. température de retour;
Tigran Babajanyan
la source
8
Réponse la plus
claire
2
c'est celui-là qui m'a fait comprendre clairement .. merci.
rematnarab
22
i = ++a + ++a + a++;

est

i = 6 + 7 + 7

Fonctionnement : incrément de a à 6 (valeur actuelle 6) + incrément de a à 7 (valeur actuelle 7). La somme est de 13 maintenant, ajoutez-la à la valeur actuelle de a (= 7), puis incrémentez de a à 8. La somme est de 20 et la valeur de a une fois l'affectation terminée est de 8.

i = a++ + ++a + ++a;

est

i = 5 + 7 + 8

Fonctionnement : La valeur de départ de a est 5. Utilisez-le dans l'addition, puis incrémentez-le à 6 (valeur actuelle 6). Incrémentez a de la valeur actuelle 6 à 7 pour obtenir un autre opérande de +. La somme est 12 et la valeur actuelle de a est 7. Incrémentez ensuite a de 7 à 8 (valeur actuelle = 8) et ajoutez-la à la somme précédente 12 pour obtenir 20.

codaddict
la source
ces déclarations fonctionnent de droite à gauche ou de gauche à droite?
Abhijeet
10

++aincréments aavant qu'il ne soit évalué. a++l'évalue apuis l'incrémente.

Lié à votre expression donnée:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

Les parentes que j'ai utilisées ci-dessus sont implicitement utilisées par Java. Si vous regardez les termes de cette façon, vous pouvez facilement voir qu'ils sont tous les deux identiques car ils sont commutatifs.

Aurril
la source
1
@ KlasLindbäck commutative signifie que vous pouvez échanger les deux expressions et toujours obtenir le même résultat. Donc a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 à la fin).
Aurril
8

Dans l'exemple ci-dessus

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29
vinod
la source
4

++ a est l'opérateur d'incrémentation du préfixe:

  • le résultat est calculé et stocké en premier,
  • puis la variable est utilisée.

a ++ est l'opérateur d'incrémentation de postfix:

  • la variable est utilisée en premier,
  • puis le résultat est calculé et stocké.

Une fois que vous vous souvenez des règles, EZ pour que vous calculiez tout!

Xinyi Liu
la source
4

En supposant que tu voulais dire

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

Cela évalue à:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

donc i est 6 + 7 + 7 = 20 et donc 20 est imprimé.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

donc i vaut 5 + 7 + 8 = 20 et donc 20 est à nouveau imprimé.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

et après que tout le côté droit a été évalué (y compris le réglage de a à 8) ALORS a est réglé à 6 + 7 + 7 = 20 et ainsi 20 est imprimé une dernière fois.

user93199
la source
3

quand avaut 5, a++donne alors un 5 à l'expression et s'incrémente aensuite, tandis que l' ++aincrémente aavant de passer le nombre à l'expression (ce qui donne a6 à l'expression dans ce cas).

Alors vous calculez

i = 6 + 7 + 7
i = 5 + 7 + 8
Thorbjørn Ravn Andersen
la source
3

Je crois cependant que si vous combinez toutes vos déclarations et que vous l'exécutez dans Java 8.1, vous obtiendrez une réponse différente, du moins c'est ce que mon expérience dit.

Le code fonctionnera comme ceci:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29
Rishabh Vashishtha
la source
3

Pré-incrémenter signifie que la variable est incrémentée AVANT d'être évaluée dans l'expression. Post-incrémentation signifie que la variable est incrémentée APRÈS avoir été évaluée pour être utilisée dans l'expression.

Par conséquent, regardez attentivement et vous verrez que les trois affectations sont équivalentes sur le plan arithmétique.

Oke Uwechue
la source
2

pre-increment et post increment sont équivalents sinon dans une expression

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10
Java Main
la source
0
a=5; i=++a + ++a + a++;

est

i = 7 + 6 + 7

Fonctionnement: pré / post incrémentation a une associativité "de droite à gauche", et pré a priorité sur post, donc tout d'abord pré incrément sera résolu comme (++a + ++a) => 7 + 6. puis a=7est fourni pour poster incrément => 7 + 6 + 7 =20et a =8.

a=5; i=a++ + ++a + ++a;

est

i=7 + 7 + 6

Travail: avant / après augmentation a « droite à gauche » associativité, et avant a préséance sur poste, donc avant tout incrément préalable sera résoudre comme (++a + ++a) => 7 + 6.alors a=7est fourni pour incrémenter post => 7 + 7 + 6 =20et a =8.

Vineet Sahu
la source
0

Je crois que vous exécutez toutes ces instructions différemment en
exécutant ensemble le résultat => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
Randhawa
la source