/ )
( 1
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les opérateurs et les expressions en C
CHAPITRE III
/ )
( 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
y = a * x +b ;
printf ("valeur %d", n + 2*p) ; dans laquelle apparaît l’expression n + 2 * p
/ )
( 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
Seulement en C, c’est différent
/ )
( 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
/ )
( 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
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
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
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
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
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
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
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
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
c1 + 1
| |
int | promotion numérique char -> int
|___ + ___|
|
int
c1 - c2
| |
int int promotions numériques char -> int
|___ _ ___|
|
int
/ )
( 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
2 * a > b + 5
OPÉRATEUR SIGNIFICATION
< inférieur à
<= inférieur ou égal à
> supérieur à
>= supérieur ou égal à
== égal à
!= différent de
/ )
( 11
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les opérateurs et les expressions en C
a < b == c < d est interprétée comme : ( a < b) == (c < d)
x + y < a + 2 est équivalent à : ( x + y ) < ( a + 2 )
4) Les opérateurs relationnels
/ )
( 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
Vaut 1 (vrai) si a<b et c<d sont toutes deux vraies (valeur 1)
Vaut 0 (faux) dans le cas contraire
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
/ )
( 13
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les opérateurs et les expressions en C
n && p n || p !n sont acceptées par le compilateur
if (!n) plus concise if ( n == 0 )
! a == b serait interprétée comme : ( ! a ) == b
5) Les opérateurs logiques
/ )
( 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
c + 5 = x, cette expression n’a pas de sens
/ )
( 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
++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
i++ ; ++i ; ces deux instructions sont équivalentes :
Les opérateurs unaires possèdent une priorité élevées
3 * i++ * j-- + k++ (pas besoin de parenthèses)
i++ remplace i = i + 1 et allègent l’écriture de certaines expressions
/ )
( 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
/ )
( 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
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
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
/ )
( 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
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
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
évalue d’abord a*b, puis i+j et qui prend comme valeur la dernière calculée (i+j)
/ )
( 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
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
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
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
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
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