Incrémentation et décrémentation

Deux opérateurs méritent un paragraphe spécial. Il s’agit de l’opérateur d’incrémentation ++ et de celui de décrémentation --. Ces opérateurs unaires peuvent agir sur une variable entière (y compris caractère) ou décimale, ainsi que sur les pointeurs comme on le verra, et ont deux effets groupés. La variable est en effet augmentée de 1 (incrémentation) ou diminuée (décrémentation) de 1, tandis que la valeur renvoyée est soit l’ancienne valeur de la variable (post-incrémentation ou post-décrémentation), soit la nouvelle (pré-incrémentation et pré-décrémentation).

Étudions cela sur un exemple :

int i = 4;int u = i++;int v = i--;int w = --u;int t = ++v;

À l’issue de ces initialisations, que valent les différentes variables ? Il suffit de regarder pas à pas. Au départ, i vaut 4. L’écriture u = i++ est une post-incrémentation (++ est derrière la variable i à laquelle il s’applique) qui a deux effets. D’abord, la valeur de i, soit 4, est recopiée dans u ; puis la variable i est incrémentée. À l’issue de cette seconde ligne, u vaut donc 4 et i 5. La troisième ligne est semblable, mais cette fois i est décrémenté après avoir été copié dans v; donc i vaut alors 4 et v 5.

Dans la quatrième ligne, on a une pré-décrémentation. Par conséquent, u est d’abord décrémenté, prenant ainsi la valeur 3, puis cette valeur est recopiée dans w. Dans la dernière ligne, on a une pré-incrémentation ; v est donc incrémenté, prenant la valeur 6, et recopié dans t.

À l’issue de l’ensemble, i vaut 4, u 3, v 6, w 3, t 6. Si cela ne vous paraissait pas évident au premier abord, c’est normal !

Ces deux opérateurs sont parfois très pratiques comme raccourcis d’écriture. En outre, ils correspondent à des opérations très naturelles et donc très rapides du processeur. Cependant, il est évident qu’ils diminuent la lisibilité des programmes.

On prendra garde de ne pas tenter de les appliquer à des expressions qui ne représentent pas des variables. Ainsi, l’expression :

u = (i + j)++;

est refusée par le compilateur (Error : Lvalue required), tandis que celle-ci :

u = i + j++;

est correcte, car l’opérateur d’incrémentation est prioritaire. Ici, u prend la valeur de la somme i+j, puis j est incrémenté.

Exercice 2.4

Après la séquence d’instructions suivantes, combien valent les variables ?

int i = 10, j = 3;float f = i/j;j = 10-f++*--i;
Voir solution
Précédent Précédent Sommaire Sommaire Suivant Suivant