1 of 25

/ )

( 1

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

CHAPITRE III

2 of 25

/ )

( 2

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

1) L’originalité des notions d’opérateur et d’expression en C

En C les notions d’expressions et d’instructions sont très liées

      • Expressions formées (entre autres) à l’aide d’opérateurs,
      • Instructions pouvant éventuellement faire intervenir des expressions

      • Exemple, l’instruction d’affectation :

y = a * x +b ;

      • Instruction d’affichage :

printf ("valeur %d", n + 2*p) ; dans laquelle apparaît l’expression n + 2 * p

3 of 25

/ )

( 3

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

1) L’originalité des notions d’opérateur et d’expression en C

      • Généralement, dans les autres langage, l’expression possède une valeur mais ne réalise aucune action

Seulement en C, c’est différent

        • ++i (possède une valeur et agit sur la variable)
        • k = i = 5 k = (i = 5) (possède une valeur et agit sur la variable)
      • En C, les notions d’expression et d’instruction sont étroitement liées puisque la principale instruction de ce langage est une expression terminée par un point-virgule
        • la nomme souvent « instruction expression »
        • Exemples de telles instructions (évaluation de l’expression, la valeur est inutilisée)
        • ++i ;
        • i = 5 ;
        • k = i = 5 ;

4 of 25

/ )

( 4

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

2) Les opérateurs arithmétiques en C

      • Présentation des opérateurs
        • C dispose d’opérateurs classiques « binaires » portant sur deux opérandes
          • Addition (+)
          • Soustraction (-)
          • Multiplication (*)
          • Division (/)
        • Opérateur « unaire » ne portant que sur une seul opérande
          • correspondant à l’opposé noté « - » (comme dans -n ou dans -x+y)
        • A priori, les opérandes doivent être de même type (int, long int, float, double, long double) et ils fournissent un résultat de même type que leurs opérandes

5 of 25

/ )

( 5

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

2) Les opérateurs arithmétiques en C

      • Les priorités relatives des opérateurs
        • Lorsque plusieurs opérateurs apparaissent dans une même expression, dans quel ordre ils sont mis en jeu
        • Les opérateurs unaires + et - ont la priorité la plus élevée
        • Ensuite, à un même niveau, les opérateurs *, / et %
        • Enfin, sur un dernier niveau, apparaissent les opérateurs binaires + et
        • En cas de priorités identiques, les calculs s’effectuent de gauche à droite
        • Les parenthèses permettent d’outrepasser ces règles de priorité, en forçant le calcul préalable de l’expression qu’elles contiennent

a + b * c a + ( b * c )

a * b + c % d ( a * b ) + ( c % d )

- c % d ( - c ) % d

- a + c % d ( - a ) + ( c % d )

- a / - b + c ( ( - a ) / ( - b ) ) + c

- a / - ( b + c) ( - a ) / ( - ( b + c ) )

6 of 25

/ )

( 6

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

3) Les conversions implicites pouvant intervenir dans un calcul d’expression

      • Notion d’expression mixte
        • Les opérateurs arithmétiques ne sont définis que lorsque leurs deux opérandes sont de même type
        • Seulement, on peut écrire ce que l’on nomme des « expressions mixtes » dans lesquelles interviennent des opérandes de types différents
        • Exemple d’expression autorisée, n(int) et p(int), et x(float) :

n * x + p

Règles de priorité, il faut effectuer le produit n*x

Conversion de la valeur de n dans le type float

Multiplication de deux opérandes de type float

Résultat de type float

Même mécanisme pour l’addition

7 of 25

/ )

( 7

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

3) Les conversions implicites pouvant intervenir dans un calcul d’expression

      • Les conversions d’ajustement de type
        • Une conversion se fait suivant une hiérarchie sans dénaturer la valeur initiale:
          • int -> long -> float -> double -> long double (conversions directe autorisées)
          • Le choix des conversions à mettre en œuvre est effectué en considérant un à un les opérandes concernés et non pas l’expression de façon globale
          • Exemple, soit n(int), p(long) et x(float), n * p + x

n * p + x

| | |

long | | conversion de n en long

| | |

|__ * __| | multiplication par p

| |

long | le résultat de * est de type long

| |

float | il est converti en float

| |

|____ + ____| pour être additionné à x

|

float résultat de type float

8 of 25

/ )

( 8

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

3) Les conversions implicites pouvant intervenir dans un calcul d’expression

      • Les promotions numériques
        • Comme les opérateurs numériques ne sont pas définis pour les types char et short
        • Le C prévoit que toute valeur de l’un de ces deux types est d’abord convertie en int, sans considérer les types des éventuels autres opérandes, c’est la « promotion numérique » « conversion systématique »
        • Exemple, si p1(short), p2(short) et p3(short) et x(float)

p1 * p2 + p3 * x

p1 * p2 + p3 * x

| | | |

int int int | promotions numériques short -> int

|____ * ____| | |

| | |

int float | conversion d’ajustement de type

| |___ * ___ |

| |

float float conversion d’ajustement de type

|_________ + _________|

|

float

9 of 25

/ )

( 9

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

3) Les conversions implicites pouvant intervenir dans un calcul d’expression

      • Le cas du type char
        • Même chose pour le type char: un caractère peut toujours correspondre à un entier
        • Exemple, on suppose que c1(char) et c2(char), tandis que n(int)

c1 + 1

| |

int | promotion numérique char -> int

|___ + ___|

|

int

c1 - c2

| |

int int promotions numériques char -> int

|___ _ ___|

|

int

10 of 25

/ )

( 10

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

4) Les opérateurs relationnels

        • C permet de comparer des expressions à l’aide d’opérateurs classiques de comparaison, exemple :

2 * a > b + 5

        • Le résultat de la comparaison est : 0 si (faux), 1 si (vrai).
        • Ainsi, la comparaison devient une expression de type entier. Et elle pourra intervenir dans des calculs arithmétiques
        • Les expressions seront soumises aux règles de conversion présentées dans le paragraphe précédent

OPÉRATEUR SIGNIFICATION

< inférieur à

<= inférieur ou égal à

> supérieur à

>= supérieur ou égal à

== égal à

!= différent de

11 of 25

/ )

( 11

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

      • Les opérateurs (<, <=, >, >=) sont de même priorité (grande)
      • Les deux opérateurs (== et !=) possèdent également la même priorité (petite)

a < b == c < d est interprétée comme : ( a < b) == (c < d)

        • Cette expression vaudra 1 lorsque les relations a < b et c < d auront toutes les deux la même valeur et 0 pour le cas contraire
        • Les opérateurs relationnels sont moins prioritaires que les opérateurs arithmétiques

x + y < a + 2 est équivalent à : ( x + y ) < ( a + 2 )

4) Les opérateurs relationnels

12 of 25

/ )

( 12

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

5) Les opérateurs logiques

        • C dispose de trois opérateurs logiques classiques :
          • et (noté &&),
          • ou (noté ||)
          • non (noté !).
        • Exemples :
          • (a<b) && (c<d)

Vaut 1 (vrai) si a<b et c<d sont toutes deux vraies (valeur 1)

Vaut 0 (faux) dans le cas contraire

          • (a<b) || (c<d)

Vaut 1 (vrai) si l’une au moins des deux conditions a<b et c<d est vraie (valeur 1)

Vaut 0 (faux) dans le cas contraire

          • ! (a<b) vaut1 (vrai) si a<b est fausse (de valeur 0) et prend la valeur 0 (faux) dans le cas contraire. Equivalente à: a>=b

13 of 25

/ )

( 13

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

        • si n et p sont des entiers, des expressions telles que :

n && p n || p !n sont acceptées par le compilateur

if (!n) plus concise if ( n == 0 )

        • L ’opérateur ! a une priorité supérieure à celle de tous les opérateurs arithmétiques binaires et aux opérateurs relationnels
        • Pour écrire la condition contraire de a == b il faut utiliser des parenthèses ! ( a == b )

! a == b serait interprétée comme : ( ! a ) == b

        • L ’opérateur || est moins prioritaire que &&. Les deux sont de priorité inférieure aux opérateurs arithmétiques ou relationnels

5) Les opérateurs logiques

14 of 25

/ )

( 14

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

6) L’opérateur d’affectation ordinaire

c = b + 3

        • La priorité de l’opérateur = est inférieure à celle de tous les opérateurs arithmétiques et de comparaison
        • D’abort, on évalue l’expression b + 3, en suite la valeur est affectée à c
        • Par contre, il n’est pas possible de faire apparaître une expression comme premier opérande de cet opérateur =

c + 5 = x, cette expression n’a pas de sens

      • Notion de lvalue
        • Ce terme désigne une « valeur à gauche », c’est-à-dire tout ce qui peut apparaître à gauche d’un opérateur d’affectation, les variables sont des lvalue(s)
      • L’affectation peut entraîner une conversion
        • Lorsque le type de l’expression figurant à droite n’est pas du même type que la lvalue, il y a conversion systématique de la valeur de l’expression

15 of 25

/ )

( 15

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

7) Les opérateurs d’incrémentation et de décrémentation

      • Rôle
        • En C, on utilise des opérateurs « unaires » portant sur la lvalue
        • Pour i = 5

++i a pour effet d’incrémenter de 1 la valeur de i

n = ++i - 5 affectera à i la valeur 6 et à n la valeur 1

n = i++ - 5 affectera à i la valeur 6 et à n la valeur 0

Pré-incrémentation et de Post-incrémentation

        • lorsque seul importe l’effet d’incrémentation d’une lvalue

i++ ; ++i ; ces deux instructions sont équivalentes :

      • Priorités

Les opérateurs unaires possèdent une priorité élevées

3 * i++ * j-- + k++ (pas besoin de parenthèses)

      • Intérêt

i++ remplace i = i + 1 et allègent l’écriture de certaines expressions

16 of 25

/ )

( 16

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

8) Les opérateurs d’affectation élargie

      • i += k remplace i = i + k
      • a *= b remplace a = a * b
      • Voici la liste complète de tous ces nouveaux opérateurs nommés « opérateurs d’affectation élargie » += -= *= /= %=

17 of 25

/ )

( 17

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

9) Les conversions forcées par une affectation

      • Une affectation introduit une conversion d’office dans le type de la lvalue réceptrice,
      • Exemple: si n(int) et x(float), l’affectation :

n = x + 5.3 ; évaluation de l’expression à droite, qui fournira une valeur de type float ; cette dernière sera ensuite convertie en int pour pouvoir être affectée à n.

18 of 25

/ )

( 18

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

10) L’opérateur de cast

      • On peut forcer la conversion d’une expression quelconque dans un type de son choix, à l’aide d’un opérateur « cast ».
      • Exemple, si n et p sont des variables entières, l’expression : (double) ( n/p ) aura comme valeur celle de l’expression entière n/p convertie en double.
      • Ici, il y a d’abord calcul, dans le type int du quotient de n par p ; c’est seulement ensuite que le résultat sera converti en double. Si n vaut 10 et que p vaut 3, cette expression aura comme valeur 3
      • Priorité élevée (double) n/p est equivalente à (double n)/p, pour le même exemple on aura 3.3333

19 of 25

/ )

( 19

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

11) L’opérateur conditionnel

      • max = a>b ? a : b est équivalente à:

      • D’une manière générale, l’opérateur évalue la première expression qui joue le rôle d’une condition. Si sa valeur est différente de zéro, il y a évaluation du second opérande, ce qui fournit le résultat ; si sa valeur est nulle, en revanche, il y a évaluation du troisième opérande, ce qui fournit le résultat

3*a+1 > 0 ? 3*a+1 : -3*a-1

z = (x=y) ? a : b

z = x = y ? a : b est équivalente à: z = x = ( y ? a : b )

z = ( a>b ? a : b ) ;

a>b ? i++ : i-- ; évaluation sans utiliser la valeur de i

if ( a>b )

max = a ;

else

max = b ;

20 of 25

/ )

( 20

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

12) L’opérateur séquentiel

      • L ’opérateur dit « séquentiel » permet d’exprimer plusieurs calculs successifs au sein d’une même expression
      • Exemple : a * b , i + j

évalue d’abord a*b, puis i+j et qui prend comme valeur la dernière calculée (i+j)

      • i++, a + b
      • i++, j = i + k évaluation de l’expression i++, évaluation de l’affectation j = i + k
      • ces deux formulations sont équivalentes :
        • i++, j = i+k, j-- ; (avec des virgules)
        • i++ ; j = i+k ; j-- ; (avec des points virgules)
      • Dans les boucles
        • if (i++, k>0) ...... remplace i++ ; if (k>0) ......
        • for (i=1, k=0 ; ... ; ... ) ....... remplace i=1 ; for (k=0 ; ... ; ... ) ......

21 of 25

/ )

( 21

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

13) L’opérateur sizeof

      • L ’opérateur sizeof fournit la taille en octets
      • Exemple, dans une implémentation où le type int est représenté sur 4 octets et le type double sur 8 octets:

      • sizeof(char) vaudra toujours 1
      • Cet opérateur offre un intérêt :

lorsque l’on souhaite écrire des programmes portables dans lesquels il est nécessaire de connaître la taille exacte de certains objets,

int n ;

double z ;

l’expression sizeof(n) vaudra 4

l’expression sizeof(z) vaudra 8

22 of 25

/ )

( 22

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

Exercice 1

1) Soit les déclarations suivantes :

int n = 10 , p = 4 ;

long q = 2 ;

float x = 1.75 ;

Donner le type et la valeur de chacune des expressions suivantes :

a) n + q

b) n + x

c) n % p +q

d) n < p

e) n >= p

f) n > q

g) q + 3 * (n > p)

h) q && n

i) (q-2) && (n-10)

j) x * (q==2)

k) x *(q=5)

Exercice 1 :

a) long 12

b) float 11,75

c) long 4

d) int 0

e) int 1

f) int 1

g) long 5

h) int 1

i) int 0

j) float 1,75

k) float 8,75

23 of 25

/ )

( 23

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

Exercice 2

2) Écrire plus simplement l’instruction suivante :

z = (a>b ? a : b) + (a <= b ? a : b) ;

Exercice 2 :

z = a + b ;

24 of 25

/ )

( 24

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

Exercice 3

3) n étant de type int, écrire une expression qui prend la valeur :

-1 si n est négatif,

0 si n est nul,

1 si n est positif.

Exercice 3 :

n ? (n>0 ? 1 : -1) : 0) ou n>0 ? 1 : (n ? -1 : 0)

25 of 25

/ )

( 25

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les opérateurs et les expressions en C

Exercice 4

4) Quels résultats fournit le programme suivant ?

#include <stdio.h>

main()

{

int n=10, p=5, q=10, r ;

r = n == (p = q) ;

printf ("A : n = %d p = %d q = %d r = %d\n", n, p, q, r) ;

n = p = q = 5 ;

n += p += q ;

printf ("B : n = %d p = %d q = %d\n", n, p, q) ;

q = n < p ? n++ : p++ ;

printf ("C : n = %d p = %d q = %d\n", n, p, q) ;

q = n > p ? n++ : p++ ;

printf ("D : n = %d p = %d q = %d\n", n, p, q) ;

}

Exercice 4 :

A : n = 10 p = 10 q = 10 r = 1

B : n = 15 p = 10 q = 5

C : n = 15 p = 11 q = 10

D : n = 16 p = 11 q = 15