Instruction opératoire et affectation

Une instruction peut être composée simplement d’une opération, comme ceci :

i + j;

Cependant, une telle écriture est sans intérêt, puisque la somme est perdue ; elle provoque d’ailleurs éventuellement un message du compilateur (Warning : Code has no effect, c’est-à-dire attention, le code n’a pas d’effet). Par contre, l’écriture suivante :

i++;

permet d’incrémenter i. Dans ce cas, on aurait pu aussi écrire ++i en obtenant le même effet, puisqu’on n’utilise pas la valeur de i pour la recopier ailleurs. On dit que les opérateurs ++ et -- ont un effet de bord, alors que les autres n’en ont pas, dans le sens qu’ils ne modifient pas les termes auxquels ils s’appliquent.

Inversement l’affectation, que nous avons déjà rencontrée sous la forme :

i = a + b;

est en fait un opérateur = avec un effet de bord. On peut donc l’utiliser dans des expressions, par exemple comme ceci :

j = 3 * (i = a + b);

A l’issue, i vaut a+b, et j vaut le triple de i. Il s’agit là encore d’un raccourci d’écriture. Les parenthèses sont ici obligatoires, car l’opérateur = a une priorité plus faible que les autres (voir annexe). En leur absence, le compilateur tenterait de recopier a+b dans 3*i ce qui est impossible puisque 3*i n’est pas une « lvalue » , c’est-à-dire une variable.

Cette propriété de =, qui n’existe pas dans la plupart des autres langages de programmation, permet des écritures pratiques. Par exemple, une affectation à tiroirs :

i = j = k = 0;

qui place 0 dans les trois variables car, dans une affectation, la partie droite est calculée en premier, ce qui signifie que cette écriture équivaut à i = (j = (k = 0)).

Dans des appels de fonctions aussi, on souhaite parfois conserver un argument :

gotoxy( x = wherex(), y = wherey()+1 );

Attention toutefois dans les initialisations qui ne peuvent être faites à tiroirs. En effet, l’écriture :

int i = j = 0;

équivaut à :

j = 0; int i = j;

et non à :

int i = 0, j = 0;

Dans les deux premiers cas, j est supposé déjà déclaré, alors que dans le dernier, on déclare et initialise simultanément i et j.

L’opérateur d’affectation peut être combiné avec des opérateurs binaires *, /, +, -, %, <<, >>, &, |, ^ pour former un opérateur d’assignation composé. Par exemple x += y équivaut à x = x + y. Il s’agit là encore d’un raccourci d’écriture, qui donne une légère accélération au programme, car le processeur n’adresse qu’une seule fois la variable.

Ainsi les instructions :

i *= 7;    j %= 360;    k <<= 8;

ont pour effet de multiplier i par 7, remplacer j par sa valeur modulo 360, et de décaler k de huit bits vers la gauche (c’est-à-dire d’ajouter un octet nul à la fin de k, et de détruire l’octet de poids fort).

Comme il s’agit d’opérateurs d’assignation, on peut encore écrire, par exemple :

i *= (j /= 5);

ce qui a pour effet de diviser j par 5 et de multiplier i par le quotient obtenu; ainsi, si i valait 12 et j 17, en sortie ils valent respectivement 36 et 3.

Précédent Précédent Sommaire Sommaire Suivant Suivant