2010-01-17 5 views
1

Pourquoi le code suivantQuestion sur l'opérateur post-augmentation

int i = 1; 
System.out.print(i += i++); 
System.out.print(i); 

de sortie 2 deux fois au lieu de 3 pour la 2e impression?

Quelqu'un pourrait-il nous éclairer?

Merci.

+14

Il convient de noter que dans le monde réel, vous ne devriez jamais coder comme ça. Jamais. – missingfaktor

+0

@Grey: oui, juste pour comprendre cela – Ricky

Répondre

4

Si vous vous rendez compte que ++ fonctionne comme suit (pseudo-code):

funC++(ref a) 
{ 
    int b=a; 
    a=a+1; 
    return b; 
} 

alors il prend tout son sens.

+1

'ref' est un peu non triviale pour les programmeurs Java, vous savez;) –

+0

hmm. Pour ceux qui ne comprennent pas la partie ref, j'essaie de montrer que la valeur de la variable passée en (a) est modifiée sur le site d'appel par cette fonction. – spender

+0

très clair! spender – Ricky

3

Il semblerait que je devrais être 3 à la fin.

Cependant, si vous regardez dans la déclaration de plus près

i += (i++) 

est égal à

i = (i + (i++)) 

qui est, dans ce cas, 1 + 1.

L'effet secondaire de i ++ est i = i + 1 = 1 + 1 = 2 comme vous pouvez vous y attendre, cependant, la valeur de i est override après l'affectation.

-1
1 + 1 == 2. 

Par conséquent:

i + i == 2 

et

i += i == 2 

puis

i += i++ == 2 

assez simple.

+2

J'ai bien peur que l'opérateur post-incrément ne soit pas vraiment expliqué ici. – bryantsai

2

Je ne sais pas la syntaxe Java bytecode très bien encore, mais selon moi, au niveau de bytecode votre code ressemblerait à quelque chose comme ceci:

int i = 1; // iconst_1: variables { }, stack {1} 
      // istore_1: variables {1}, stack { } 
i += i++; // iload_1:  variables {1}, stack {1} 
      // iinc 1, 1: variables {2}, stack {1} 
      // iadd:  variables {2}, stack {2} ...Note that here 1 gets added to the value on stack 
      // istore_1: variables {2}, stack {2} ...Here the variable value will overwrite the stack value 

Je pense que cela explique la sortie que vous obtenez assez bien. :-)

experts, s'il vous plaît me corriger si je me trompe ...

2

Je ne pense pas que ce soit un problème de ne pas savoir comment l'opérateur postfix unaire (expr ++) fonctionne. C'est l'ordre dans lequel les déclarations sont évaluées qui crée la confusion.

int i = 1; 
System.out.println(i += i++); // Output: 2 

Ainsi, la dernière déclaration est le même que les deux énoncés suivants dans cet ordre:

i++; // i is now 2 for the rest of this statement and the program 
i = 1 + 1; // i is assigned again 

Ainsi, l'opérateur de Postfix est évalué en premier mais la ligne entière est évaluée mais en utilisant la valeur précédente de je.

Ainsi, pour utiliser un autre exemple qui rendrait cela plus clair:

int i = 2; 
System.out.println(i += i++); // Output: 4 
System.out.println(i); // Output: 4 

Et un autre exemple:

int i = 2; 
System.out.println(i = i + i++ + i--); // Output: 7 
System.out.println(i); // Output: 7 

La deuxième ligne est assignant i. La première i est 2, la prochaine i est également 2, mais maintenant le troisième i est 3 parce i ++ a changé la valeur de i. Comme dans le cas précédent, i-- n'aura aucun effet sur i car il sera réécrit avec i = 2 + 2 + 3.

int i = 1; 
System.out.println(i = i++ + i); // Output: 3 
System.out.println(i); // Output: 3 
+0

explication très gd. – Ricky