951 votes

Quelle est la différence entre ++ i et i ++

En C, quelle est la différence entre l’utilisation de et , et qui doit être utilisé dans le bloc d’incrémentation d’une `` boucle ?

1184voto

Mark Harrison Points 77152
  • ++i incrémente la valeur de i, puis de retourner la valeur incrémentée.

     i = 1;
     j = ++i;
     (i is 2, j is 2)
    
  • i++ incrémente la valeur de i, mais le retour à la valeur d'origine qu' i détenus avant d'être augmentés.

     i = 1;
     j = i++;
     (i is 2, j is 1)
    

Pour un for boucle, soit des œuvres. ++i semble de plus en plus commun, peut-être parce que c'est ce qui est utilisé dans le K&R.

Dans tous les cas, suivre les directives "préfèrent ++i sur i++" et vous ne vous tromperez pas.

Il ya un couple de commentaires au sujet de l'efficacité de l' ++i et i++. Dans tous les non-étudiants-projet de compilateur, il n'y aura pas de différence de performances. Vous pouvez le vérifier en regardant le code généré qui sera identique.

L'efficacité de la question est intéressante... voici ma tentative de réponse: Est-il une différence de performance entre i++ et ++i en C?

Comme Sur Freund notes, c'est différent pour un objet C++, depuis operator++() est une fonction et le compilateur ne peut pas savoir à optimiser à l'écart de la création d'un objet temporaire pour contenir la valeur intermédiaire.

198voto

Parag Points 2255

i++ est connu comme Post Incrément alors que ++i est appelé Pré Incrémentation.

i++

i++ post incrément car il incrémente is'valeur par 1 après l'opération est terminée.

Permet de voir l'exemple suivant:

int i = 1, j;
j = i++;

Ici, la valeur de j = 1 mais i = 2. Ici, la valeur de i sera attribuée j d'abord, puis i sera incrémenté.

++i

++i est pré incrémentation car il incrémente is'valeur par 1 avant l'opération. Cela signifie j = i; exécuté en premier et ensuite, i++.

Permet de voir l'exemple suivant:

int i = 1, j;
j = ++i;

Ici, la valeur de j = 2 mais i = 2. Ici, la valeur de i sera attribuée j après l' i incremention d' i. De même, ++i sera exécutée avant la j=i;.

Pour votre question qui doit être utilisé dans l'incrémentation bloc d'une boucle for? la réponse est, vous pouvez utiliser un.. peu importe. Elle exécutera vos pour la boucle même pas. de fois.

for(i=0; i<5; i++)
   printf("%d ",i);

Et

for(i=0; i<5; ++i)
   printf("%d ",i);

Les deux boucles va produire la même sortie. ie 0 1 2 3 4.

Il importe seulement lorsque vous l'utilisez.

for(i = 0; i<5;)
    printf("%d ",++i);

Dans ce cas, la sortie sera 1 2 3 4 5.

46voto

Andy Lester Points 34051

S’il vous plaît ne vous inquiétez pas quant à le « efficacité » (vitesse, vraiment) dont l’un est plus rapide. Nous avons des compilateurs ces jours-ci que prendre soin de ces choses. Utilisez celui qui est logique d’utiliser, basé sur indiquant plus clairement votre intention.

41voto

Ryan Fox Points 5181

++ J’incrémente la valeur, puis il revient.

i ++ retourne la valeur et puis il incrémente.

Il y a une différence subtile.

Pour une boucle for, utiliser ++ je, telle qu’elle est légèrement plus rapide. i ++ créera une copie supplémentaire qui vient se jeter.

22voto

OysterD Points 2698

La raison pour laquelle ++ j’ai peut être un peu plus rapide que i ++ est que i ++ peut exiger une copie locale de la valeur d’i avant elle obtient incrémentée, tandis que ++ je ne fait jamais. Dans certains cas, certains compilateurs permettent d’optimiser il loin si possible... mais il n’est pas toujours possible, et pour ce faire, pas tous les compilateurs.

J’ai essayer de ne pas compter trop d’optimisations des compilateurs sur, donc je suivrais les conseils de Ryan Fox : quand je peux utiliser à la fois, j’ai utiliser ++ j’ai.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X