Chap5 Expressions et opérateurs PDF
Document Details
Uploaded by RestfulHolmium1139
ISI Ariana
Tags
Summary
Ce document présente les expressions et les opérateurs utilisés en programmation C. Il décrit les types d'expressions, les opérateurs unaires et binaires, ainsi que leur priorité et leur associativité. Le document aborde également les conversions de types et donne des exemples d'utilisation pratique.
Full Transcript
5 Expressions et opérateurs Une grande partie d’un code source consiste à effectuer des calculs. Ceux-ci sont réalisés en évaluant des expressions, qui contiennent généralement des opérateurs. Cette section définit d’abord les notions d’expression, d’opérateur et d’opérande,...
5 Expressions et opérateurs Une grande partie d’un code source consiste à effectuer des calculs. Ceux-ci sont réalisés en évaluant des expressions, qui contiennent généralement des opérateurs. Cette section définit d’abord les notions d’expression, d’opérateur et d’opérande, puis passe en revue les principaux opérateurs du langage C et les notions qui leur sont relatives. 5.1 Expressions Dans le contexte d’un langage de programmation, on appelle expression toute représentation d’une valeur. Expression : élément ou combinaison d’éléments possédant une valeur. Puisqu’une expression possède une valeur, elle a aussi un type de données. On distingue deux types d’expressions : simples ou complexes. Expression simple : expression composée d’un seul élément. Une variable seule ou une constante seule (qu’elle soit symbolique ou littérale) sont des expressions simples. L’évaluation d’une expression simple est directe, car on peut obtenir sans aucun calcul la valeur associée. Expression complexe : expression composée de la combinaison de plusieurs expressions. L’évaluation d’une expression complexe est indirecte, puisqu’il faut d’abord évaluer les expressions qu’elle contient, puis les combiner, avant d’obtenir sa propre valeur. La valeur et le type d’une expression complexe dépendent non seulement des valeurs des expressions qu’elle contient, mais aussi de la façon dont ces valeurs sont combinées. La combinaison se fait via des fonctions et/ou des opérateurs. On sait déjà qu’une fonction est un bloc d’instructions auquel on a donné un nom, et associé des paramètres d’entrée et un type de retour. Soit par exemple la fonction ma_fonction suivante, qui prend deux entiers en paramètres et renvoie une valeur entière en résultat. int ma_fonction(int a, int b) { return (a+b)*2 ; } La syntaxe de l’appel d’une fonction consiste à préciser le nom de la fonction, puis les paramètres entre parenthèses. Ces paramètres sont des expressions, dont le type doit correspondre à ceux indiqués dans l’en-tête de la fonction. Ainsi, pour l’exemple précédent, on peut effectuer l’appel ma_fonction(1,2) : celui-ci constitue une expression de type int et de valeur 6. Par contre, l’appel ma_fonction(1.1,2) pose problème, car le premier paramètre est un réel. Un opérateur peut être considéré comme une fonction particulière : Prepa A1 AU : 24-25 1/11 Programmation C / H.CH Opérateur : fonction ayant la particularité d’être prédéfinie dans le langage de programmation, et de ne pas respecter la syntaxe des fonctions classiques. Les paramètres d’un opérateur sont appelés des opérandes. Opérande : paramètre d’un opérateur. Exemple : pour l’expression 1+2 : L’opérateur est + Les opérandes sont 1 et 2 La valeur est 3 Le type est int Il est bien sûr possible de placer plusieurs fonctions ou opérateurs dans une expression, par exemple : Plusieurs fonctions : ma_fonction(ma_fonction(1,2),3), dont la valeur est 18 Plusieurs opérateurs : (1+2)+(3+4), dont la valeur est 10 On peut aussi mélanger fonctions et opérateurs dans une même expression, par exemple : 1+ma_fonction(1,2) a la valeur 7. 5.2 Opérateurs Dans cette sous-section, nous présentons d’abord des propriétés communes à tous les opérateurs, puis nous détaillons les différents opérateurs du langage C. 5.2.1 Généralités Un opérateur est notamment caractérisé par son arité, sa priorité et son sens d’associativité. Arité : nombre de paramètres d’un opérateur. L’opérateur peut être unaire (1 paramètre), binaire (2 paramètres), ternaire (3 paramètres)…, -aire. La plupart des opérateurs sont unaires ou binaires, ce qui signifie qu’ils prennent respectivement un ou deux paramètres. Exemple : l’opérateur d’addition est un opérateur binaire, car il prend deux opérandes : 1+2 Remarque : la notion d’arité s’applique aussi aux fonctions, en considérant le nombre de paramètres. Priorité : valeur numérique indiquant dans quel ordre les opérateurs doivent être appliqués dans le cas où une expression en contient plusieurs. Exemple : l’addition + a une priorité inférieure à la multiplication *, donc 1+2*3 est égal à 1+(2*3) Sens d’associativité : indique si les expressions contenant plusieurs opérateurs de même priorité doivent être évaluées en considérant les opérandes de gauche à droite ou de droite à gauche. Exemple : l’addition est évaluée de gauche à droite, ce qui signifie que pour l’expression 1+2+3, on va d’abord évaluer 1+2 (qui vaut 3) puis 3+3 (ce qui donne un total de 6). Remarque : il est recommandé d’utiliser des parenthèses en cas d’incertitude sur les priorités des opérateurs utilisés, voire simplement pour améliorer la lisibilité de l’expression. Attention de ne pas confondre un opérateur et le symbole utilisé pour le représenter. En langage C, plusieurs opérateurs distincts sont représentés par le même symbole. Exemples : Prepa A1 AU : 24-25 2/11 Programmation C / H.CH Symbole - : correspond à la fois à l’opérateur opposé, qui est unaire (ex. : -1) et à l’opérateur soustraction, qui est binaire (ex. : 1-2) Symbole / : correspond à la fois à l’opérateur de division réelle si on l’applique à au moins un réel, et à la division entière (ou euclidienne) si ses deux opérandes sont entiers. 5.2.2 Opérateurs unaires Un opérateur unaire agit sur un seul opérande qui peut-être une constante, une variable, ou une expression. Ainsi, l'opérateur unaire - permet d'inverser le signe et on peut écrire : -2 où 2 est une constante ; -i où i est une variable ; -(i+2) où i+2 est une expression. Le tableau 5.1 donne la liste des opérateurs unaires. Nous allons prendre quelques exemples pour expliquer l'utilisation de base de ces opérateurs sur les variables : int var=10, *pint=&var, nvar=0 ; et long f=20L ;. Tableau 5.1-Liste des opérateurs unaires. Opérateur Utilisation & opérateur d’adresse * opérateur d’indirection sur une adresse -- opérateur de décrémentation ++ opérateur d’incrémentation sizeof opérateur donnant la taille en octet ! non logique, il sert à inverser une condition - moins unaire : inverse le signe + plus unaire : sert à confirmer 5.2.2.1 Opérateurs d'adresse et d'indirection Le & est l'opérateur d'adresse, il retourne l'adresse de la variable suivant le &. &var donne l'adresse de la variable var. Cette adresse peut être utilisée pour affecter un pointeur (à la condition que le pointeur soit d'un type compatible avec l'adresse de la variable) : int* pint = &var ; Le * est l'opérateur d'indirection. Il permet d'accéder à une variable à partir d'une adresse (souvent contenue dans un pointeur). *&var donne la valeur 10, de même que *pint, puisque pint a été initialisé à partir de l'adresse de var. On va détailler l’utilisation de l’opérateur d’indirection à la suite du cours. 5.2.2.2 Opérateurs d'incrémentation et de décrémentation Les opérateurs -- et ++ permettent de décrémenter et d'incrémenter des variables. D'une manière simpliste, nos pouvons considérer que : var-- est équivalent à var = var - 1; var++ est équivalent à var = var + 1. Il est possible d'utiliser les opérateurs unaires d'incrémentation et de décrémentation après ou avant la variable. Ce qui permet de post-incrémenter, de pré-incrémenter, de post-décrémenter ou Prepa A1 AU : 24-25 3/11 Programmation C / H.CH de pré-décrémenter. Lorsque l'opérateur est préfixé, l'opération est appliquée avant que la valeur correspondant à l'opération ne soit calculée. Dans le cas où l'opération est post-fixée, la valeur de la variable avant l'opération est utilisée pour les autres calculs et ensuite l'opération est appliquée. Prenons comme exemple, deux entiers i et j, et initialisons ces deux variables avec la valeur 0 : int i=0, j=0;. Si nous écrivons j = ++i, c'est une pré-incrémentation de la variable i. Cela signifie incrémenter i de 1 puis mettre la valeur de i dans j. À la fin de cette opération i vaut 1 et j vaut 1. Nous pouvons considérer cette opération comme équivalente à i = i+1 ; j = i ;. Si au contraire, nous écrivons j = i++ ;, cela signifie mettre la valeur de i dans j puis incrémenter i de 1. En partant des mêmes valeurs, i valant 0 et j valant 0, à la fin de cette opération i vaut 1 et j vaut 0. Cette opération est équivalente à j = i ; i = i+1 ;. 5.2.2.3 Opérateur de dimension sizeof donne la taille en octets de la variable. Exemple : long int f ; sizeof(f) ; donne la valeur 4. L'opérateur sizeof peut aussi donner la taille d'un type, le type doit être entre parenthèses. Dans notre exemple, sizeof(f) est équivalent à sizeof(long). Les calculs associés à l'opérateur sizeof() sont réalisés par le compilateur lors de la traduction du langage en assembleur, et non lors de l'exécution du programme. L'expression sizeof(f) est donc une valeur constante et peut entrer dans la construction d'une expression constante (calculable lors de la compilation). 5.2.2.4 Non logique, plus et moins unaires Le non logique sert à inverser une condition de vrai à faux et réciproquement. En langage C, une expression est fausse si la valeur qu'elle retourne est égale à 0, elle est vraie sinon. De plus, la norme spécifie que !0 vaut 1. Dans notre exemple, !var vaut 0 car var est vraie puisque var contient 10. Le moins unaire inverse le signe de l'expression qui le suit. Le plus unaire sert à confirmer le signe de l'expression. 5.2.3 Opérateurs binaires Le tableau 5.2 donne la liste des opérateurs binaires. Tableau 5.2-Liste des opérateurs binaires. Type d’opérateurs Opérateurs Usage Arithmétique + - addition, soustraction, * / multiplication, division, % reste de la division entière. Masquage & | ^ et, ou, ou exclusif. Décalage >> = supérieur, supérieur ou égal, == != égal, non égal. Logique && | | et logique, ou logique. Affectation voir tableau 5.3 affectation. Succession , succession. Prepa A1 AU : 24-25 4/11 Programmation C / H.CH 5.2.3.1 Opérateurs arithmétiques Le langage C permet l'utilisation des opérateurs de calcul que l'on trouve habituellement dans les autres langages, à savoir : l'addition, la soustraction, la multiplication et la division. Il utilise pour cela les symboles respectifs : + - * /. Comme nous avons déjà vu les opérateurs unaires, vous remarquerez l'utilisation contextuelle dans le cas des trois symboles : + - *. Le compilateur détermine la signification de l'opérateur à son nombre d'opérandes. Comme nous le verrons plus loin, le type (au sens type des données) de l'opération est déterminé par le type des valeurs sur lesquelles portent l'opération. Les opérations arithmétiques classiques peuvent s'appliquer aux types entiers et dans ce cas elles ont un comportement d'opération entière (en particulier la division). Ces opérations s'appliquent aussi aux types avec partie décimale et dans ce cas, elles donnent un résultat avec partie décimale. Le langage C introduit l'opérateur modulo, noté %, qui permet d'obtenir le reste de la division entière déterminée par les deux opérandes associés au %. Par exemple, l'expression 14 % 3 donne la valeur 2. 5.2.3.2 Opérateurs de manipulation de bits Ces opérateurs servent à manipuler des entiers bit à bit. Les opérandes doivent être de type entier. On a les opérateurs de masquage et les opérateurs de décalage. Opérateurs de masquage : & : a & b, ET logique bit à bit (AND), | : a | b, OU logique inclusif bit à bit (OR), ^ : a ^ b, OU logique exclusif bit à bit (XOR), ~ : ~ a, complément à 1, les bits sont inversés 1 0 et 01. (c’est un opérateur unaire !). Opérateurs de décalage : : a >> n, Décalage vers la droite de n bits, les bits de poids faible disparaissent tandis que des 0 apparaissent par la gauche. 5.2.3.3 Opérateurs booléens Les opérateurs de relation servent à réaliser des tests entre les valeurs de deux expressions. Comme nous le verrons dans le chapitre 6, ces opérateurs sont surtout utilisés à l'intérieur des instructions de contrôle (tests). Les opérateurs de relation algébrique sont au nombre de six : =, == et !=. Ces opérateurs peuvent être utilisés avec des variables de type entier ou des variables ayant une partie décimale. Notez le double égal pour le test d'égalité qui est souvent source de confusion avec le simple égal qui décrit l'affectation. Les deux autres opérateurs de tests (&& et | | ) sont appelés respectivement le « et logique » et le « ou logique ». Le « et logique » permet de décrire qu'une condition constituée de deux parties est satisfaite si et seulement si les deux parties sont satisfaites. Le « ou logique » permet de décrire qu'une condition constituée de deux parties est satisfaite dés lors qu'une des deux parties au moins est satisfaite. Ces opérateurs s'appliquent à des expressions que l'on peut considérer Prepa A1 AU : 24-25 5/11 Programmation C / H.CH comme de type entier et dont la valeur est testée comme pour le non logique à savoir une expression est considérée comme fausse si la valeur correspondante à cette expression est égale à 0. Ainsi en langage C, pour tester si une variable de type entier j contient une valeur comprise entre deux bornes non strictes 12 et 143 on écrit : (j >= 12) && (j >= de gauche à droite < > = de gauche à droite == != de gauche à droite Prepa A1 AU : 24-25 7/11 Programmation C / H.CH & de gauche à droite ^ de gauche à droite | de gauche à droite && de gauche à droite || de gauche à droite ? : de droite à gauche = += -= *= /= %= = &= ^= |= de droite à gauche , de gauche à droite Remarque : tous les opérateurs de la 2ème ligne du tableau sont unaires. Evaluation d’une expression : Pour évaluer une expression complexe, on procède comme suit : 1-On détermine les différents opérateurs constituant l’expression. 2-On classifie ces opérateurs selon leur priorité. 3-On évalue successivement l’expression de chaque opérateur (expression formée par l’opérateur et son/ses opérande(s)) en commençant par le plus prioritaire et en terminant par le moins prioritaire, en respectant l’associativité de chaque opérateur. Pour faciliter la tâche, on peut isoler cette expression en la délimitant par deux parenthèses. 4-Une expression formée par des opérateurs de même priorité est évaluée selon le sens défini par leur associativité. Exemple : int x ; x=3+4*2-6 ; On a quatre opérateurs : = + * - Par ordre de priorité décroissante, ses opérateurs seront classés comme suit : * + - =. (+ et – ont même priorité). On évalue donc : 4*2 vaut 8 puis 3+8 vaut 11 puis 11-6 vaut 5 puis la valeur 5 est affectée à la variable x (x=5). Exercice : Déterminer la valeur de chacune des expressions dans le tableau ci-dessous : int i, j, k, p=2, q=1; i=j=k=p; N° Expression Valeur N° Expression Valeur 1 4==5==0 26 i