Historique de la question :
Les opérateurs d'incrément ++ et de décrément -- sont apparus dans les premières versions de C et ont été inspirés par les capacités des langages de bas niveau. Les formes préfixées (++i, --i) et postfixées (i++, i--) offrent au programmeur des sémantiques différentes avec un coût de calcul minimal.
Problème :
La principale difficulté vient du fait que les formes préfixées et postfixées se comportent différemment : la forme préfixée augmente/diminue d'abord la valeur, puis retourne le résultat, alors que la forme postfixée retourne d'abord la valeur initiale, puis modifie la variable. Dans les expressions imbriquées, cela crée souvent de la confusion, un comportement inattendu et une utilisation erronée de la valeur.
Solution :
Il est essentiel de faire clairement la distinction sur ce que retourne chaque forme. La version préfixée est utilisée lorsque l'on a besoin immédiatement de la nouvelle valeur. La version postfixée est utilisée lorsqu'il est important de conserver l'ancienne (par exemple, pour la passer à une fonction ou pour la logique d'un compteur). Une bonne pratique consiste à éviter des expressions complexes avec plusieurs incrémentations et à ne pas mélanger leur utilisation avec des effets secondaires.
Exemple de code :
int i = 5; printf("%d\n", ++i); // Affichera 6 printf("%d\n", i++); // Affichera 6, mais maintenant i est devenu 7
Caractéristiques clés :
Peut-on utiliser i = i++ et que se passera-t-il ?
L'utilisation de la construction i = i++ entraîne un comportement indéfini : le compilateur n'est pas obligé de garantir le résultat attendu, et le programme peut se comporter de manière imprévisible.
Exemple de code :
int i = 1; i = i++; printf("%d\n", i); // Le résultat dépend du compilateur : peut afficher 1 ou 2
Pourquoi est-il dangereux d'utiliser des incrémentations dans une même ligne avec plusieurs utilisations de la même variable ?
Avec plusieurs modifications de la même variable dans une expression (par exemple, f(i++, i++)), le comportement n'est pas défini selon la norme C. Le résultat final dépend de l'implémentation spécifique du compilateur.
i++ est-il toujours plus rapide que ++i ?
Non. Dans les compilateurs modernes, il n'y a généralement pas de différence, car le compilateur optimise les deux formes de manière identique, sauf si la valeur retournée par l'expression elle-même est utilisée.
Dans une boucle, un développeur a écrit :
for (int i = 0; i < 10;) arr[i] = i++ * 2;
Avantages :
Inconvénients :
for (int i = 0; i < 10; i++) arr[i] = i * 2;
Avantages :
Inconvénients :