Vous êtes sur la page 1sur 3

i++ ou ++i ?

J.-C. Chappelier, J. Sam, V. Lepetit version 1.0 de septembre 2013

On rencontre souvent dans la littrature et dans des exemples de code lutilisation de loprateur dincrmentation postx, comme par exemple dans lexpression i++, alors que dans le cours nous avons opt pour une notation prxe, par exemple ++i. Y a-t-il une diffrence et si oui quelle est-elle ? Et pourquoi un tel choix pour le cours ?

Effet et valeur

Avant tout vous ne pourrez pas pleinement comprendre ce dont il sagit si vous ne distinguez pas ce que fait une expression de ce quelle vaut. En C++, toute expression fait quelque chose et vaut quelque chose. Elle vaut quelque chose en ce sens quon peut par exemple la mettre droite dune affectation. Par exemple, i = 3 est une affectation, mais en C++, cest aussi une expression. Cest une expression qui fait une affectation de la valeur 3 la variable i. Mais cette expression vaut aussi quelque chose, cest--dire que lon peut parfaitement crire : j = i = 3; ce qui signie : j = (i = 3); ou encore : met dans j la valeur de lexpression i = 3 . Ceci est tout fait licite en C++. Je mempresse immdiatement de dire quil faut absolument viter dutiliser ce genre dexpressions qui rendent le code beaucoup moins intelligible. Rappelez vous que vous devez toujours crire le code le plus clair possible ! Que vaut donc lexpression i = 3 ? Il se trouve quelle vaut le rsultat de laffectation, donc 3 ici. Ainsi j = (i = 3); est la mme chose que i = 3; j = i;

i++ et ++i

Je peux maintenant expliquer la diffrence entre les expressions i++ et ++i : ces deux expressions font exactement la mme chose : elles incrmentent i ; en revanche, leurs valeurs sont diffrentes. 1

Si vous nutilisez pas la valeur de ces expressions 1 , il ny aura donc pour vous aucune diffrence. Utiliser leur valeur signierait par exemple crire des choses comme : j = ++i;, ce que je vous dconseille une fois de plus de faire. Leur seule diffrence est donc au niveau de leur valeur : i++ vaut la valeur de i avant incrmentation alors que ++i vaut la valeur de i aprs incrmentation. Si lon prend lexemple suivant : int i(3); int j(i); // i et j ont la mme valeur int k(0); int l(0); k = ++i; // oprateur prfix l = j++; // oprateur postfix A lissue de ce bout de code, i et j auront tous les deux la valeur 4 (les deux oprateurs font la mme chose), mais k aura la valeur 4 alors que l aura la valeur 3 (les deux oprateurs ne valent pas la mme chose).

Lequel prfrer ?

Encore une fois, si vous nutilisez pas la valeur de retour et si vous ntes pas dans un langage qui permette de surcharger (= rednir) ces oprateurs 2 , alors il ny aura pour vous aucune diffrence pratique entre ces deux notations. Ceci dit, il y deux bonnes raisons de prfrer la notation prxe (++i) celle postxe (i++) : lune conceptuelle et lautre plus pragmatique dans les langages o ces oprateurs peuvent tre surchargs. La raison conceptuelle est la suivante : quelle opration voulons nous exprimer par i++ (ou ++i) ? Si cest i = i + 1 alors la seule qui lui soit totalement quivalent est ++i. En effet, quelle est la valeur de lexpression i = i + 1 ? Cest bien la valeur de i aprs incrment, la mme que celle de ++i. En dautres termes, par quoi remplacer i = i + 1 dans j = i = i + 1; Le seul remplacement valide entre i++ et ++i est le second : j = ++i; Voil pour la raison conceptuelle.
1. Et si vous ne surchargez pas ces oprateurs, voir la section Lequel prfrer ?. 2. Java ne le permet pas, mais C++ oui.

Dun point de vue pratique maintenant : si le langage permet de surcharger ces oprateurs (et C++ le permet), alors il faut toujours prfrer la notation prxe (++i) car elle est sensiblement moins coteuse. Je prtends en effet, sans le dmontrer ici, que loprateur prx peut simplmenter sans aucune copie, alors quil est impossible de faire loprateur postx sans copie. Loprateur postx cote donc toujours une copie de plus que loprateur prx. Si ces oprateurs sont surchargs pour des objets coteux copier, alors la diffrence de performance se fera sentir ! Pour ces deux raisons, il est donc prfrable dutiliser loprateur prx (++i) celui postx (i++). Et cest pour cela quil en est ainsi dans ce cours.

Vous aimerez peut-être aussi