• Aucun résultat trouvé

Les instructions sont les éléments de base du programme. Tout les traitements des programmes C/C++

sont donc effectués par des suites d’instructions.

Il existe plusieurs types d’instructions en C/C++ :

les instructions simples ;

les instructions composées ;

les structures de contrôle.

1.5.1. Les instructions simples

Les instructions simples sont identifiées par le point virgule. C’est ce caractère qui marque la fin d’une instruction. Le programme evalue l’expression délimitée par l’instruction précédente et ce point virgule. Cette expression peut être vide, le résultat de l’invocation d’une fonction, ou une combinaison d’expressions plus simples par des opérateurs.

Exemple 1-10. Exemple d’instructions

; /* Instruction réduite à sa plus simple expression (ne fait rien) */

printf("Hello World!\n"); /* Instruction appelant une fonction */

i = j + m; /* Instruction évaluant une combinaison d’opérateurs */

Les principales opérations que l’on peut réaliser dans une expression sont les suivantes : Tableau 1-2. Opérateurs du langage C/C++

Opérateur Signification

a = b Opérateur d’affectation.areçoit la valeur deb. Renvoie la valeur deb. a + b Opérateur d’addition. Renvoie la valeur de la somme deaet deb.

a - b Opérateur de soustraction. Renvoie la valeur de la soustraction deaet deb. a * b Opérateur de multiplication. Renvoie la valeur du produit deaet deb.

a / b Opérateur de division. Pour les entiers, renvoie la valeur de la division euclidienne (division entière) deaet deb. Pour les nombres à virgule flottante, renvoie la valeur de la division deaet deb.

a % b Opérateur de reste de division. Cet opérateur renvoie la valeur du reste de la division euclidienne des entiersaetb.

a & boua bitand b

Opérateur de conjonction. Renvoie la valeur du « et » logique bit à bit deaetb. Chaque bit du résultat est calculé à partir des bits correspondants deaet debavec la règle suivante : 1 et 1 = 1, (0 et x) = (x et 0) = 0.

a | boua bitor b

Opérateur de disjonction. Renvoie la valeur du « ou » logique bit à bit deaet deb. Chaque bit du résultat est calculé à partir des bits correspondants deaet debavec la règle suivante : 0 ou 0 = 0, (1 ou x) = (x ou 1) = 1.

Chapitre 1. Première approche du C/C++

Opérateur Signification a ^ boua

xor b

Opérateur de disjonction exclusive. Renvoie la valeur du « ou exclusif » logique bit à bit (généralement appelé « xor ») de deaet deb. Chaque bit du résultat est calculé à partir des bits correspondants deaet debavec la règle suivante : 1 xor 1

= 0, 0 xor 0 = 0 et (1 xor 0) = (0 xor 1) = 1.

~aoucompl a

Opérateur de négation. Renvoie la valeur dont chaque bit est l’inverse du bit correspondant dea(0 devient 1 et vice versa).

a << b Opérateur de décallage binaire à gauche. Renvoie la valeur deadont les bits ont été décallés vers les bits de poids fortbfois. Les bits de poids faible insérés sont nuls. Comme l’ajout d’un 0 à la droite d’un nombre revient à le multiplier par sa base, cet opérateur permet de multiplierapar deux à la puissanceb(s’il n’y a pas de débordement des bits par la gauche bien entendu).

a >> b Opérateur de décallage binaire à droite. Renvoie la valeur deadont les bits ont été décallés vers les bits de poids faiblebfois. Les bits de poids fort insérés sont nuls.

Cela revient à diviserapar deux à la puissanceb.

++a Opérateur de pré-incrémentation. Ajoute 1 àaet retourne le résultat obtenu.

a++ Opérateur de post-incrémentation. Ajoute 1 àaet renvoie la valeur précédente de celui-ci.

--a Opérateur de pré-décrémentation. Ôte 1 deaet renvoie la valeur obtenue.

a-- Opérateur de post-décrémentation. Öte 1 deaet renvoie la valeur précédente de celui-ci.

a ? b : c Opérateur ternaire. Évalue la valeur de l’expressionaet, selon qu’elle est vraie ou non, évalue l’expressioncou l’expressionb. Cet opérateur permet donc de faire un test et de choisir une valeur ou une autre selon le résultat de ce test.

a , b Opérateur virgule. Évalue les expressionsaetbet retourne la valeur deb.

On notera que les affectations ne sont pas des instructions. Ce sont bien des opérations, dont la valeur est la valeur affectée. Il est donc possible de réutiliser cette valeur dans une expression plus complexe.

Un cas intéressant est l’utilisation de cette valeur pour faire une autre affectation : il est ainsi possible d’effectuer des affectations multiples :

i=j=k=m=0; /* Annule les variables i, j, k et m. */

De tous les opérateurs, c’est sans doute l’opérateur d’affectation qui est le plus utilisé. C’est pour cette raison que le C et le C++ proposent des opérateurs d’affectations composées. Une affectation compo-sée est une opération permettant de réaliser en une seule étape une opération normale et l’affectation de son résultat dans la variable servant de premier opérande. Les affectations composées utilisent la syntaxe suivante :

variable op_aff valeur

oùop_affest l’un des opérateurs suivants : ’+=’, ’-=’, ’*=’, etc. Cette syntaxe est strictement équi-valente à :

variable = variable op valeur

et permet donc de modifier la valeur devariableen lui appliquant l’opérateurop.

Chapitre 1. Première approche du C/C++

Exemple 1-11. Affectation composée

i*=2; /* Multiplie i par 2 : i = i * 2. */

Note : Les opérateurs ’&=’, ’|=’ et ’^=’ peuvent également s’écrire respectivement ’and_eq’,

or_eq’ et ’xor_eq’.

Les opérateurs d’incrémentation et de décrémentation++et--peuvent s’appliquer comme des pré-fixes ou des sufpré-fixes sur les variables. Lorsqu’ils sont en préfixe, la variable est incrémentée ou décré-mentée, puis sa valeur est renvoyée. S’ils sont en suffixe, la valeur de la variable est renvoyée, puis la variable est incrémentée ou décrémentée. Par exemple :

int i=2,j,k;

j=++i; /* À la fin de cette instruction, i et j valent 3. */

k=j++; /* À la fin de cette ligne, k vaut 3 et j vaut 4. */

Note :On prendra garde à n’utiliser les opérateurs d’incrémentation et de décrémentation post-fixés que lorsque cela est réellement nécessaire. En effet, ces opérateurs doivent contruire un objet temporaire pour renvoyer la valeur de la variable avant incrémentation ou décrémentation.

Si cet objet temporaire n’est pas utilisé, il est préférable d’utiliser les versions préfixées de ces opérateurs.

L’opérateur ternaire d’évaluation conditionnelle?:est le seul opérateur qui demande 3 paramètres (à part l’opérateur fonctionnel()des fonctions, qui admet n paramètres, et que l’on décrira plus tard).

Cet opérateur permet de réaliser un test sur une condition et de calculer une expression ou une autre selon le résultat de ce test. La syntaxe de cet opérateur est la suivante :

test ? expression1 : expression2

Dans cette syntaxe,testest évalué en premier. Son résultat doit être booléen ou entier. Sitestest vrai (ou si sa valeur est non nulle),expression1est calculée et sa valeur est renvoyée. Sinon, c’est la valeur deexpression2qui est renvoyée. Par exemple, l’expression :

Min=(i<j)?i:j;

calcule le minimum deiet dej.

L’opérateur virgule, quant à lui, permet d’évaluer plusieurs expressions successivement et de renvoyer la valeur de la dernière expression. La syntaxe de cet opérateur est la suivante :

expression1,expression2[,expression3[...]]

oùexpression1,expression2, etc. sont les expressions à évaluer. Les expressions sont évaluées de gauche à droite, puis le type et la valeur de la dernière expression sont utilisés pour renvoyer le résultat. Par exemple, à l’issue des deux lignes suivantes :

double r = 5;

Chapitre 1. Première approche du C/C++

int i = r*3,1;

rvaut 5 etivaut 1.r*3est calculé pour rien.

Note :Ces deux derniers opérateurs peuvent nuire gravement à la lisibilité des programmes. Il est toujours possible de réécrire les lignes utilisant l’opérateur ternaire avec un test (voir le Chapitre 2 pour la syntaxe des tests en C/C++). De même, on peut toujours décomposer une expression utilisant l’opérateur virgule en deux instructions distinctes. Ce dernier opérateur ne devra donc jamais être utilisé.

1.5.2. Les instructions composée

Il est possible de créer desinstructions composées, constituées d’instructions plus simples. Les ins-tructions composées se présentent sous la forme de blocs d’insins-tructions où les insins-tructions contenues sont encadrées d’accolades ouvrantes et fermantes (caractères ’{et ’}’).

Exemple 1-12. Instruction composée

{

i=1;

j=i+3*g;

}

Note :Un bloc d’instructions est considéré comme une instruction unique. Il est donc inutile de mettre un point virgule pour marquer l’instruction, puisque le bloc lui-même est une instruction.

1.5.3. Les structures de contrôle

Enfin, il existe tout un jeu d’instructions qui permettent de modifier le cours de l’exécution du pro-gramme, comme les tests, les boucles et les sauts. Ces instructions seront décrites en détail dans le chapitre traitant des structures de contrôle.