2015-03-03 2 views
1

Pourquoi est-ce que dans Java, i-- et -i ont le même comportement à l'intérieur d'un pour la boucle?Pourquoi "-i" et "i--" ont-ils le même comportement dans une boucle Java for?

ex .: Ma variable "i" ne diminue pas avant le bouclage:

for(int i = 5; i > 0; --i) { 
    System.out.println(i); 
} 

et

for(int i = 5; i > 0; i--) { 
    System.out.println(i); 
} 

... sera à la fois l'impression 5,4,3,2,1 .

Mais ceci:

int i = 5; 
System.out.println(--i); 


int i = 5; 
System.out.println(i--); 

... imprimera 4 et 5.

+2

Voir cette question sur la différence entre les opérateurs pré et post décrément: http://stackoverflow.com/questions/5413548/java-prefix-postfix-of-increment-decrement-operators – Matthew

+2

"Pourquoi --i doesn ' t travailler en java pour la boucle? " - Ça fonctionne parfaitement. – zubergu

Répondre

3

Pour les boucles fonctionnent comme ceci:

for(<Part that will be executed before the loop>; 
    <Part that is the condition of the loop>; 
    <Part that will be executed at the end of each iteration) { 
    <statements> 
} 

Toute boucle peut donc être réécrite comme ceci:

<Part that will be executed before the loop> 
while(<Part that is the condition of the loop>) { 
    <statements> 
    <Part that will be executed at the end of each iteration> 
} 

En utilisant votre exemple pour faire des résultats dans:

int i = 5; // Part that will be executed before the loop 
while(i > 0) { // Part that is the condition of the loop 
    System.out.println(i); // statements 
    --i; // Part that will be executed at the end of each iteration 
} 

Comme vous pouvez le voir, cela n'a pas d'importance pour la sortie si c'est --i ou i-- depuis t L'appel d'impression arrivera toujours avant que la variable ne soit décrémentée. Pour obtenir le résultat souhaité, vous pouvez essayer ceci:

int i = 5; 
while(i > 0) { 
    --i; 
    System.out.println(i); 
} 
+0

Bonne explication. –

+0

Merci mhlz! Peut-on dire alors que "for (int i = 5; i> 0; - i)" est exactement le même que "for (int i = 5; i> 0; i--)"? – Odyssee

+0

Les deux produiront exactement le même résultat, donc je suppose que vous pourriez le dire. – mhlz

4

C'est parce que la boucle for fonctionne comme ceci:

for (<1. variable declaration and initialization>; 
    <2. condition to loop>; 
    <4. for update>) { 
    <3. statements> 
} 

Votre i-- ou --i condition est exécuté après l'exécution des instructions dans la boucle for et avant de vérifier la condition à boucler. Ce qui signifie, peu importe si vous utilisez i-- ou --i dans la section pour la mise à jour.

4

Les deux --i et i-- ont le même effet secondaire, en décrémentant i par un. Ils diffèrent dans leur valeur de résultat. Dans le code de boucle, vous n'utilisez que l'effet secondaire, en ignorant le résultat. Dans le code println autonome, vous affichez le résultat.

0

Je pense que la façon la plus simple de le mettre est que, dans les boucles, vous imprimez comme ceci:

System.out.println(i); 

Notez l'argument println() est "i", pas "i--" ou "--i". La diminution a déjà eu lieu ailleurs. Vous n'imprimez pas le résultat du décrément mais la valeur de "i" dans la boucle.