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


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.


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.


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;

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.


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.


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

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!


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.


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

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

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.


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

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.


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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.