2010-07-26 2 views
2

Supposons que j'ai initialisées deux variables comme celui-ciComment fonctionnent les pré-incréments et les post-incréments?

int a=0; 
int b=0; 

Maintenant, si j'assigne b une valeur comme cette

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

maintenant a = 3 et b = 5 Shouldnt il a été b = 2? Pourquoi b a-t-il la valeur 5?

+0

Il sera ecaluated comme b = 0 + 2 + 3 et à la fin b sera 5 et a sera 3. – jaxb

+0

Très probablement un doublon. – ripper234

+0

duplication possible de [expliquer travail de post et pré opérateur d'incrémentation en Java] (http://stackoverflow.com/questions/2371118/explain-working-of-post-and-pre-increment-operator-in-java) –

Répondre

0

permet de voir:

  • a ++ = 0, par la suite augmenté de 1.

  • ++ a = (l'un de l'a ++ plus un preincreased) 2

  • ++ a = (les deux du ++ un au-dessus plus un pré-augmenté) 3

total: 0 + 2 + 3 = 5

Ceci explique aussi pourquoi a est trois. Dans la dernière étape a est augmenté à trois.

0

il fonctionne comme ceci

b = a + ++ ++ + ++ a une

b = 0 + 2 (1 + 1) + 3 (2 + 1)

b = 5.

et a = 3

Dans une ++ qui utilise l'opérateur d'incrément après, la valeur actuelle de la variable est utilisée en premier, puis obtient incrémentée.

mais dans ++ a qui utilise un opérateur de pré-incrémentation, l'incrément se produit d'abord puis est utilisé. donc le comportement est comme prévu.

0

Faisons inspectent avec mon outil préféré: javap ...

Le bytecode émis par Suns javac pour

int a = 0; 
int b = 0; 
b = a++ + ++a + ++a; 

se présente comme suit:

           a b Stack: 
0: iconst_0  // push 0     0 0 0 
1: istore_1  // store in a    0 0 empty 
2: iconst_0  // push 0     0 0 0 
3: istore_2  // store in b    0 0 empty 
4: iload_1  // push value of a   0 0 0 
5: iinc 1, 1 // inc a with 1   1 0 0 
8: iinc 1, 1 // inc a with 1 again  2 0 0 
11: iload_1  // push value of a again 2 0 0,2 
12: iadd   // add top two elements 2 0 2 
13: iinc 1, 1 // inc a with 1   3 0 2 
16: iload_1  // push a again   3 0 2,3 
17: iadd   // add top two elements 3 0 5 
18: istore_2  // store in b    3 5 empty 
+0

j'ai manqué sur l'utilisation de javap, j'essayais d'utiliser jdb il a toujours incrémenté dans les étapes de 1 instruction donc ne pouvait pas savoir ce qui se passait réellement – GoodSp33d

Questions connexes