C : Quelle est la différence entre ++i et i++ ?

En C, quelle est la différence entre l'utilisation de ++i et de i++, et laquelle doit être utilisée dans le bloc d'incrémentation d'une boucle for ?

Solution
  • ++i va incrémenter la valeur de i, puis retourner la valeur incrémentée.

       i = 1 ;
       j = ++i ;
       (i est 2, j est 2)
  • i++ incrémentera la valeur de i, mais retournera la valeur originale que i avait avant d'être incrémenté.

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

Pour une boucle for, les deux fonctionnent. ++i semble plus courant, peut-être parce que c'est ce qui est utilisé dans [K&R][1].

Dans tous les cas, suivez la ligne directrice "préférez ++i à i++" et vous ne vous tromperez pas.

Il y a quelques commentaires concernant l'efficacité de ++i et i++. Dans n'importe quel compilateur hors projet étudiant, il n'y aura pas de différence de performance. Vous pouvez le vérifier en regardant le code généré, qui sera identique.

La question de l'efficacité est intéressante... voici ma tentative de réponse :

Comme le note On Freund, c'est différent pour un objet C++, puisque operator++() est une fonction et que le compilateur ne peut pas savoir s'il doit optimiser la création d'un objet temporaire pour contenir la valeur intermédiaire.

[1] : https://en.wikipedia.org/wiki/The_C_Programming_Language

Commentaires (14)

++i incrémente la valeur, puis la retourne.

i++ retourne la valeur, puis l'incrémente.

C'est une différence subtile.

Pour une boucle for, utilisez ++i, car il est légèrement plus rapide. i++ créera une copie supplémentaire qui sera simplement jetée.

Commentaires (2)

La raison pour laquelle ++i peut être légèrement plus rapide que i++ est que i++ peut nécessiter une copie locale de la valeur de i avant qu'elle ne soit incrémentée, alors que ++i ne le fait jamais. Dans certains cas, certains compilateurs vont optimiser cette copie si possible... mais ce n'est pas toujours possible, et tous les compilateurs ne le font pas.

J'essaie de ne pas trop compter sur les optimisations des compilateurs, donc je suivrais le conseil de Ryan Fox : quand je peux utiliser les deux, j'utilise ++i.

Commentaires (1)