Techniques de
Programmation
Pr. : Mohamed El KAMILI
Contact : [Link]@[Link]
Cycle : Ingénieur
Département : GE
Année : 2018/2019
Techniques de Programmation 1/102
Plan
Généralités
Programmation informatique
Algorithmique
Programmation en langage C
Introduction
Notion de variable en C
Mots-clés du langage C
Structures de contrôle
Les tableaux
Variables composites
Les fonctions
La récursivité
Les fichiers
Techniques de Programmation 2/102
Programmation en C
Historique
L’histoire du C est très liée à l'histoire du système UNIX.
En 1969, la 1ère version du système UNIX voit le jour
programmée en assembleur.
Ken Thompson créa un nouveau langage de programmation,
nommé B.
En 1971, création du successeur de B, nommé C, créé par
Dennis Ritchie.
En 1983, un standard pour le langage C est créé :
la norme ANSI (American National Standards Institute).
La plupart des compilateurs (Borland, Microsoft, GNU CC,
GCC, …) utilisent ce standard.
un programme écrit en ANSI C est compilable presque
partout.
Techniques de Programmation 3/102
Programmation en C
Caractéristiques du langage C
Langage structuré;
Langage modulaire : Peut être découpé en modules qui
peuvent être compilés séparément;
Langage universel : Permet de développer tout type
d’applications ; OS, jeux, …;
Langage typé : Tout objet C doit être préalablement déclaré
avant d’être utilisé;
Langage puissant et efficace;
Langage portable : Sur n'importe quel système en possession
d'un compilateur C.
Techniques de Programmation 4/102
Programmation en C
Caractéristiques du langage C
Le langage C est un langage compilé;
Les compilateurs assurent les opérations suivantes:
Analyse lexicale;
Pré-traitement (préprocesseur);
Analyse syntaxique (parsing);
Analyse sémantique; et
Génération de code optimisé en langage bas niveau.
Techniques de Programmation 5/102
Programmation en C
Caractéristiques du langage C
Fichier Compilateur C
Source C
Code
Assembleur
Assembleur
Code Objet
Code Linker
exécutable
Techniques de Programmation 6/102
Programmation en C
Anatomie d’un programme C
Programme typique en C
include
Main() toujours la
1ère fonction appelée
main()
fonction a() instructions
fonction b() instructions
instructions
Techniques de Programmation 7/102
Programmation en C
Programme typique en C
/* exemple de programme C :
-somme des nb de 1 à 10 et affichage de la valeur*/
En C le programme principal 1
#include <stdio.h> 0 s'appelle toujours main
int main (void) 1
{ déclarations de variables de
type entier (cases mémoire 2
int somme; int i; 2 pouvant contenir un entier)
somme = 0; 3
instruction d'affectation de
valeur à la variable somme 3
for (i = 1; i <= 10; i++)
4 { l'instruction entre accolades
somme = somme + i; est exécutée pour les valeurs 4
de i allant de 1 à 10
}
printf ("%d\n", somme); 5 affiche à l'écran la valeur de 5
somme = 0; l'entier contenu dans somme
}
Techniques de Programmation 8/102
Programmation en C
Instruction en langage C
Les actions ou "instructions" en langage C ne sont en fait que
des opérations élémentaires (+,-, * etc…) sur des données
unitaires (variables).
Chaque instruction est suivie d'un ;
Le début d'un bloc est signalé par un { , la fin d'un bloc par }.
Un bloc devient l'équivalent syntaxique d'une instruction.
Exemple: {
x=1 Obligatoire
x=1;
y=2
Calcul
y=2;
z = x+y z=x+y;
imprimer z printf("%d",z);
};
optionnel
Techniques de Programmation 9/102
Programmation en C
Type d’instructions en langage C
Déclarations des variables
Affectations
Opérations
Fonctions
Contrôle
Techniques de Programmation 10/102
Programmation en C
La notion de variable en C
Nom d’une variable
La norme ANSI C est assez souple pour ce qui concerne le
nommage des variables, mais aussi assez stricte sur certains
points : Un nom de variable :
Peut contenir des lettres de A à Z, et de a à z, ainsi que les
dix chiffres de 0 à 9, et le caractère underscore ('_');
Ne doit pas commencer par un chiffre;
Le langage C est sensible à la casse.
Techniques de Programmation 11/102
Programmation en C
La notion de variable en C
Type d’une variable
Toutes les variables doivent être explicitement typées (pas
de déclaration implicite comme en fortran)
Il y a globalement trois (quatre ?) types de variables :
int,
Les entiers : short int, long int
Les réels : float, double, long double
Les caractères : char
Rien … : void
Exemples : short int ma_note;
double cheese;
char avoile;
Techniques de Programmation 12/102
Programmation en C
La notion de variable en C
Déclaration d’une variable
Déclarer une variable est une opération extrêmement
simple, qui nécessite deux choses :
Le type de de variable que l'on souhaite créer,
et le nom que l'on souhaite lui donner.
Le type de variable que l'on souhaite créer dépend, bien
évidemment, de nos besoins, et nous le choisirons parmi les
types disponible ou encore crées.
Exemple : int a;
float note;
Techniques de Programmation 13/102
Programmation en C
La notion de variable en C
Initialisation d’une variable
On appelle "initialisation" d'une variable le fait de lui
donner une valeur pour la première fois;
Pour donner une valeur à une variable (on dit "affecter"
une valeur à une variable), on utilise l'opérateur
d'affectation, '=' (Le symbole égal);
Cet opérateur affecte à la variable placée à sa gauche le
résultat de l'expression placée à sa droite.
En C, on peut initialiser une variable à sa déclaration !
Exemples :
short int age=21;
int x=-3, b=15;
Techniques de Programmation 14/102
Programmation en C
La notion de variable en C
Portée ou visibilité d’une variable
Variable globale : Une variable déclarée au début du code, c'est-à-dire
avant tout bloc de donnée, sera globale, on pourra alors l'utiliser à partir
de n'importe quel bloc d'instruction.
Variable locale : Une variable déclarée à l'intérieur d'un bloc
d'instructions (dans une fonction ou une boucle par exemple) aura une
portée limitée à ce seul bloc d'instruction, c'est-à-dire qu'elle est
inutilisable ailleurs. On parle alors de variable locale.
Techniques de Programmation 15/102
Programmation en C
La notion de variable en C
Le type Caractère
Caractère : Symboles alphanumériques (a,z,0,1,9) + caractères
spéciaux (retour à la ligne, beep, etc..)
Un caractère est représenté sur un octet (8 bits) suivant la
table ASCII (American Standard Code for Information
Interchange)
Exemple : 'a' = 9710 = 6116 = 0110 00012 =141
Table ASCII
ex : code ASCII du 'A' = 65
'A'<'B'<……..< 'Z'
'0'<'1'<'2'<…..<'9'
'a'<'b'<……….<'z'
Techniques de Programmation 16/102
Programmation en C
La notion de variable en C
Le type Caractère : Table ASCII
Techniques de Programmation 17/102
Programmation en C
La notion de variable en C
Le type Caractère : Table ASCII
A retenir :
les chiffres sont codés suivant un ordre croissant (48 à 57)
idem pour les lettres (65 à 90, 97 à 122)
code des majuscules est inférieur au code des minuscules
(différence constante = 32)
les codes supérieurs à 128 dépendent de la langue :
é, ö , ä, æ, œ etc…
Techniques de Programmation 18/102
Programmation en C
La notion de variable en C
Le type Entier
C’est une variable codée sur 2 ou 4 octets suivant le calculateur
n 1
x xi 2i , xi 0,1, n 16 ou 32
i 0
Sur deux octets on peut coder les nombres de 0 à 216-1 (0 à 65535)
Représentation en base 2: les bits sont rangés dans des cellules
correspondant à leur poids, on complète à gauche par des 0
Exemple : 13 = 8 + 4 +1 = 1*23+1*22+0*21+1*20
=0000000000001101
Déclaration d'une variable entier naturel x
unsigned int x;
short unsigned int x; (on force sur 16 bits)
long unsigned int x; (on force sur 32 bits)
Techniques de Programmation 19/102
Programmation en C
La notion de variable en C
Le type Entier relatif
La première idée est de marquer le signe du nombre de façon simple : le
signe puis la représentation de sa valeur absolue. Ainsi :
00000110 = +6 en décimal
Et
10000110 = −6 en décimal
Malheureusement cette représentation possède deux inconvénients:
Le premier (mineur) est que le nombre zéro (0) possède deux
représentations: 00000000 et 10000000, respectivement égales à 0 et −0.
L'autre inconvénient (majeur) est que cette représentation impose de
modifier l'algorithme d'addition ; si un des nombres est négatif, l'addition
binaire usuelle donne un résultat incorrect.
Exemple : 00000011 + 10000100 = 10000111
Soit 3 + (−4) = (−7) au lieu de (−1)
Techniques de Programmation 20/102
Programmation en C
La notion de variable en C
Le type Entier relatif : Complément à 2
Implantation sur 2 ou 4 octets suivant le compilateur
Représentation sur n bits : codage complément à 2
n2
x xn 1 2 n 1 xi 2i , xi 0,1
i 0
Déclarations
int a,b;
….
a = 1;
….
b= -3;
Techniques de Programmation 21/102
Programmation en C
La notion de variable en C
Le type Entier relatif : Complément à 2
Si xn-1 = 0 : nombre positif,
xn-1 = 1 : nombre négatif
Exemple sur 16 bits
+5 = 1 * 22 + 0 * 21 + 1 * 20 = 0000 0000 0000 0101
-3 = -215+ 214 + 213 + 212 + 211 + 210 + 29 + 28 + 27 + 26 + 25 + 24
+ 23 + 1.22 + 0. 21 + 1.20
= 1111 1111 1111 1101
-3 = -27 + 26 + 25 + 24 + 23 + 1.22 + 0. 21 + 1.20
Techniques de Programmation 22/102
Programmation en C
La notion de variable en C
Le type Entier relatif : Complément à 2
Représentation non symétrique : le plus petit nombre n’a
pas d’opposé : sur n bits
le plus grand entier positif est 2n-1-1
le plus petit entier négatif est -2n-1
000
111 001
0
-1 1
Exemple sur 3 bits :
110 -2 2 010
-3 3
101 -4 011
100
Techniques de Programmation 23/102
Programmation en C
La notion de variable en C
Le type réel
Déclaration
float x,y;
x = 3.14;
y = 2.0 e+3;
Implantation sur 4 octets
Représentation suivant le compilateur
En général mantisse exposant (norme IEEE)
L’ensemble de valeurs : 10-38 < x < 1038
Extension :
double x; x est codé sur 8 octets
Techniques de Programmation 24/102
Programmation en C
La notion de variable en C
Le type réel : Représentation (virgule flottante selon la norme IEEE)
M : Mantisse ; calage = 2 -1 , k nombre de bits attribué à
l’exposant
Représentation IEEE 754 (signe 1 bit, mantisse et exposant : le
tout sur 32 ou 64 bits pour simple et double précision)
SM : signe de la mantisse : 1 bit
Eb : exposant biaisé (décalage) : 8 ou 11 bits (E=Eb+calage)
M : Mantisse : 23 ou 52 bits SM E M
Techniques de Programmation 25/102
Programmation en C
La notion de variable en C
Le type réel : Représentation
Signe : bit de poids fort (0 = + ; 1 = -)
Exposant
placé avant la mantisse pour simplifier les comparaisons (pour
ceci il ne doit pas être représenté en complément à deux : -1 > 2)
sur 8 bits : 0…256
sans signe mais décalé de 127 (simple précision) :
Eb = 1 ⇒ E = 1 + 127 = 128
Eb = -3 ⇒ E = -3 + 127 = 124
les exposants 255 (erreur) et 0 (nb dénormalisé) sont interdits
Mantisse
Normalisée : bit de poids fort n’est pas 0 et un seul chiffre avant
la virgule
Exemple : 11,012 = 1,101 * 21
Techniques de Programmation 26/102
Programmation en C
La notion de variable en C
Résumé sur les types
Caractère : 1 octet
Ex : 'a' = 6116 0 1 1 0 0 0 0 1
Entier relatif : 2 ou 4 octet, représentation complément à 2
Ex 1 : +5 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
Ex 2 : -5 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
x : indique le signe
Réel : 4 octets, représentation virgule flottante
Ex : -6,5 = -110,12 = -1,101 * 22 2+127 = 129 = 27 +20
1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 … 0 0 0
Techniques de Programmation 27/102
Programmation en C
La notion de variable en C
Complément de type : static
Static : une telle variable maintient sa valeur à travers les appels de
la fonction
void inc( ) void inc( )
{ {
int i=0; static int i=0;
i++; //i=i+1; i++;
printf ("%d", i); printf ("%d", i);
} }
1, 1, 1, 1, … 1, 2, 3, 4, …
/* i est initialisée à chaque appel de /* i est initialisée à 0 à la
la fonction inc() */ compilation seulement */
Techniques de Programmation 28/102
Programmation en C
La notion de variable en C
Complément de type : register
Register
Une déclaration "registre" indique au compilateur qu'une variable
sera utilisée fréquemment.
Si c'est possible, le compilateur utilisera un registre pour implanter
la variable plutôt qu'un emplacement mémoire (vitesse d'exécution)
register int i;
Techniques de Programmation 29/102
Programmation en C
La notion de variable en C
Conversion de type : Le casting
Conversion explicite : ( type ) expression
Exemple :
int a; float x; char c;
a=2;
x=a;
x=2.3;
a= (int) (x+1);
a = 98;
c = (char) a; => c='b'
Conversion implicite : Conversion du type le plus faible vers le type le plus
fort : char < short ≤ int ≤ long < float < double
Exemple :
int a; float x; char c;
a=2; x= a;
x=2.3;
a= x+1;
a = 98;
c = a; => c='b'
Techniques de Programmation 30/102
Programmation en C
La notion de variable en C
Conversion de type : Le casting
Exemples :
char c; int i; float f;
// conversion entier vers char
c=98; // implicite : c prend le code ASCII 98 c-à-d 'b'
c = (char) 98; // explicite plus propre
// char vers entier
i= 'a' ; // i prend la valeur 97
i= (int) 'a' ; //plus propre
// entier vers réel
f=3; // f prend la valeur 3.0;
f=(float) 3; //+ propre
//réel vers entier, attention : troncature
i = 3.4; // i prend la valeur 3
i= -3.3; // i prend la valeur -3
i = (int) 3.4; // + propre
Techniques de Programmation 31/102
Programmation en C
La notion de variable en C
Conversion de type : Modifier la casse
Passer au caractère suivant
char c;
c ='a';
c = c+1; // calcul fait en entier puis résultat converti en char
c = (char) ((int) c+1) ; //+ propre
Conversions majuscule minuscule
char c;
c='t';
// conversion en Majuscule
c=c-32; // c contient 'T'
ou mieux
c=c-('a'-'A');
c=c+1; // c contient 'U'
// conversion en minuscule
c=c+32;
ou c=c+('a'-'A')
// conversion en Majuscule
if ((c >= 'a') && (c <= 'z')) c = c-('a'-'A');
Techniques de Programmation 32/102
Programmation en C
La notion de variable en C
Les constantes
Une constante est une variable dont la valeur ne peut pas changer
durant la durée de vie d’un programme
Directive du préprocesseur
Utilisation du mot clé define qui est placé au début du programme
Instruction de déclaration
Utilisation du mot clé const qui est placé avant ou après le type de la
variable
Techniques de Programmation 33/102
Programmation en C
La notion de variable en C
Les constantes : exemples
#include <stdio.h>
#define CO 10
int c = 5;
void main(){
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("La résultat est : %d", (a+b)*c/CO);
}
#include <stdio.h>
int const co = 5;
void main(){
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("La résultat est : %d", (a+b)*co);
}
Techniques de Programmation 34/102
Programmation en C
Expression en C
Une expression représente une donnée élémentaire : constante, variable,
un élément de tableau, la référence à une fonction ou à une valeur, le
résultat d'un calcul etc ….
Exemples
3
a+b
x=y
c = a+b
x <= y
x == y
i++
sin(3.14)
Toute expression a une valeur !
Techniques de Programmation 35/102
Programmation en C
Opérateurs arithmétiques
Opérateurs binaires
+,-
* , / , % (modulo)
Les opérandes doivent être des valeurs numériques.
entier opérateur entier => résultat entier
réel opérateur réel => résultat réel
entier opérateur réel => résultat réel
Exemples
int a,b; float a,b;
a=10; b= 3 a=12.6; b= 3.0
a+b 13 a+b 13.6
a-b 7 a-b 9.6
a*b 30 a*b 37.8
a/b 3 (division euclidienne) a/b 4.2 (division réelle)
a%b 1 a%b erreur de syntaxe
Techniques de Programmation 36/102
Programmation en C
Opérateurs arithmétiques
Opérateurs binaires
Opérateur % :
- int a;
- float x;
(a+x) % 4 incorrect.
((int) (a+x))%4 correct
- si l'un des opérandes est négatif, le résultat est négatif.
Si l'un des opérandes est de type caractère, c'est la valeur du code ASCII
qui est prise (conversion implicite char vers int ou float)
Techniques de Programmation 37/102
Programmation en C
Opérateurs arithmétiques
Opérateurs unaires
1. a/ signe : + , -
Exemple : a = -a;
2. incrémentation, décrémentation : ++ (+1) , -- (-1)
Exemple :
int i =1;
++i;
printf("%d",i) ; -> 2;
Syntaxes : ++i ou i++
++i : la valeur de i est d'abord incrémentée, la valeur résultat est
utilisée dans l'expression courante
i++ : la valeur courante de i est utilisée dans l'expression courante,
puis i est incrémenté
Techniques de Programmation 38/102
Programmation en C
Opérateurs arithmétiques
Opérateurs unaires : i++ ou ++i ?
Exemples
i=1; i=1;
printf("i= %d\n",i); => i=1 printf("i= %d\n",i); => i=1
printf("i= %d\n",++i); => i=2 printf("i= %d\n",i++); => i=1
printf("i= %d\n",i); => i=2 printf("i= %d\n",i); => i=2
Conclusions
1. appendre la règle (pour comprendre des programmes)
2. à n'utiliser que lorsque il n'y a pas d'ambiguïté :
x=y+z++; // à éviter
x++; // pas de risque
Techniques de Programmation 39/102
Programmation en C
Affectation en C
Affectation simple
syntaxe : variable = expression
la valeur de l'expression est stockée dans la mémoire à l'endroit
réservé pour la variable
Exemples :
a = 2; b=1; c=0;
a = b+c;
a = b && c;
la valeur de l'expression vaut la valeur affectée
Attention : affectation et test d'égalité
if (a=1) instruction1; else instruction2;
L'instruction1 est toujours déclenchée.
a = b = 3; (évaluation de droite à gauche)
Techniques de Programmation 40/102
Programmation en C
Affectation en C
Affectation complexe
Affectation et opération : +=, -=, *=, /=, %=,<<= , >>=, &=, |=, ^=
Syntaxe : variable opérateur expression
équivalent à : variable = variable opérateur expression
Exemple
int i;
i= 3;
i+=2; (i=i+2;)
printf("%d\n",i); 5
Techniques de Programmation 41/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Deux fonction de base : putchar() et printf()
Fonction putchar()
Syntaxe : putchar (char)
Exemple
char c;
c='a';
putchar ( c );
putchar ('\n'); équivalent à printf("%c\n%c",c, 'b');
putchar('b');
Affichage sur écran
a
b
Techniques de Programmation 42/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction printf()
Syntaxe : printf (" liste des formats ", arg1, arg2, arg3, …, argn)
les arguments sont des valeurs d'expression à imprimer
le format donne le texte mort et le mode de décodage des arguments
le format est une chaîne de caractères !
Exemple
printf("bon"); printf("jour");printf("\n"); bonjour
i=j=1;
printf("i=%d\n",i); i=1
printf("%d%d%d\n",i,j,i+j); 112
printf("%d\t%d\t%d\t%d\n",i,j,i+j,sqrt(i)); 1 1 2 1
x=3.0;
printf("%f\t%d\n",x,i); 3.000000 1
printf("%d\n%d\n",i,i+j); 1
2
Techniques de Programmation 43/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction printf()
La valeur de retour du printf() est le nombre de caractères écrits et une
valeur négative si il y a eu un problème.
Exemple
int a,x;
a=42;
x = printf ("%d\n",a);
printf ("%d\n",x); => 3
Techniques de Programmation 44/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction printf()
Caractères spéciaux de format
%d : imprime les entiers sur le nombre de caractères nécessaires
%f : imprime les réels avec 6 chiffres de partie décimale
%e : imprime les réels en notation exponentielle
%c : imprime un caractère
%s : imprime une chaîne de caractères jusqu'à rencontrer le caractère
de fin de chaine 0 (erreur si absent)
…..
Caractères d’échapement
\n : saut à la ligne %% affichage du caractère '%'
\t : tabulation \a : alerte ; beep système
\p : saut à la page \\ : affichage du caractère '\'
\0 caractère null ; valeur 0, délimiteur de fin de chaîne de caractères
…. 45/102
Techniques de Programmation
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction printf()
Forçage du nombre de caractères
entiers :
%5d l'entier est imprimé sur 5 caractères au moins (blancs)
avec cadrage à droite
%-5d l'entier est imprimé sur 5 caractères au moins (blancs)
avec cadrage à gauche
réels :
%10f le réel est imprimé sur 10 caractères (en tout) avec 6
chiffres en partie décimale (cadrage à droite)
%-10f idem + cadrage à gauche
limitation de la partie décimale
%20.3f le réel est imprimé sur 20 caractères (en tout) avec 3
chiffres en partie décimale
Techniques de Programmation 46/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction printf()
Format variable
printf("%*d", n, i) : n donne le nombre de caractères pour i
printf("%*.3f", n, x) : n donne le nombre total de caractères pour x
printf("%*.*f", n, m, x) : n donne le nombre de total caractères m donne le
nombre de caractères pour la partie décimale
Techniques de Programmation 47/102
Programmation en C
Fonctions d’entrée/sortie : Entrée standard
Lecture depuis le clavier
2 fonctions de base : getchar () et scanf()
Elles peuvent être appelées soit indépendamment soit au sein
d'expressions
Exemples
getchar();
while (c==getchar()) {
…..
};
Techniques de Programmation 48/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction getchar()
Sert à la lecture de caractères isolés
la valeur de getchar() est le code ascii du caractère lu
utilisation
char c;
c = getchar();
Exemple : on veut lire et mémoriser 2 caractères donnés sur 2 lignes
différentes
char c1,c2;
c1 = getchar(); // acquiert le 1er caractère
getchar (); // filtre le <cr>, on ne mémorise pas la valeur lue
c2 = getchar () // acquiert le 2ème caractère
Techniques de Programmation 49/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction scanf()
Sert à la lecture de données et convertit la succession de caractères donnés
en entiers, flottants, caractères, chaîne de caractères
Syntaxe : scanf (format, arg1, arg2, …, argn)
le nombre d'arguments est quelconque
arg1, arg2,……, argn sont les adresses des variables dans lesquelles on
stocke les valeurs lues
variable simple (entier, caractère, flottant) : &v
le format est une chaîne de caractères précisant le type des arguments afin
de convertir la suite de caractères lus dans les arguments
Techniques de Programmation 50/102
Programmation en C
Fonctions d’entrée/sortie : Sortie standard
Fonction scanf()
Format
chaîne de caractères composée de caractères % suivis d'une lettre et
éventuellement séparés par des blancs
la lettre indique le type de conversion à effectuer
Exemple
int i; float x;
scanf("%d %f", &i, &x);
le %d indique que le premier argument est un entier
le %f indique que le second est un réel
réponse : 23 12.6
23 est converti en entier et stocké dans i
12.6 est converti en flottant et stocké dans x
Techniques de Programmation 51/102
Programmation en C
Opérateurs relationnels et logiques
Valeur logique :
0 : faux
!0 : vrai
Exemple : if (3) traitement1 ; else traitement 2;
Equivalent à : traitement1;
Relationnels : >= , > , == , <, <= , !=
La valeur de l'expression est 1 si l'expression est vraie , 0 si elle est fausse
Exemple : 2 < 3 vaut 1 , 2 > 3 vaut 0
Attention à la confusion : test d'égalité == et l'affectation =
ex : if (x=0) traitement 1; // au lieu de x==0
else traitement 2;
Conséquence: non seulement le traitement 1 ne sera jamais exécuté
mais en plus x vaudra 0 quelle que soit sa valeur initiale
Techniques de Programmation 52/102
Programmation en C
Opérateurs relationnels et logiques
Opérateurs logiques :
&& : "et" logique
|| : "ou" logique
! : "non" logique
Dans l'évaluation de l'expression, 0 est considéré comme la valeur
logique "faux", toute autre valeur est considérée comme la valeur
logique "vraie »
La valeur de l'expression est 1 ou 0
Exemples: 2 && 0 vaut 0 et donc est faux
2 || 0 vaut 1 et donc est vrai
!0 vaut 1
!4 vaut 0
Techniques de Programmation 53/102
Programmation en C
Opérateurs bit à bit
Opèrent sur les représentations binaires des valeurs
& et binaire ,
| ou binaire,
^ ou-exclusif binaire,
~ complément à 1 ,
<<k décalage à gauche de k bits,
>>k décalage à droite de k bits,
Attention : & ≠ &&
Exemples
5 0000 0000 0000 0101
20 0000 0000 0001 0100
5 & 20 0000 0000 0000 0100 5 & 20 => 4
5 | 20 0000 0000 0001 0101 5 | 20 => 21
5 ^ 20 0000 0000 0001 0001 5 ^ 20 => 17
~5 1111 1111 1111 1010 -6
Affectation (bit-à-bit) : &=, |=, ^=, ~=
Techniques de Programmation 54/102
Programmation en C
L’opérateur conditionnel ternaire ?... : …
Syntaxe
expression1 ? expression2 : expression3
à peu près équivalent à :
if (expression1) expression2; else expression3;
Exemple
maximum = (x>y) ? x : y;
if (x>y) maximum =x ; else maximum = y;
Conseil : ne pas utiliser (peu clair)
Techniques de Programmation 55/102
Programmation en C
L’opérateur d’adressage
Adresse de : &
Syntaxe : &variable //donne l'adresse mémoire de la variable
Exemple
int i, *adr;
adr = &i;
ne pas confondre avec le "et" bit à bit
Dont l'adresse est : *
Syntaxe : *expression // donne le mot mémoire dont l'adresse est
donnée par l'expression
Exemple
int i, *adr;
i=1;
adr = &i;
printf("%d", *adr); 1
Techniques de Programmation 56/102
Programmation en C
L’opérateur de taille
L’opérateur : sizeof
Donne la taille de l'implantation ou de l’expression
2 syntaxes possibles
1. sizeof expression
Exemple
int i,j ;
j= sizeof i; 2 ou 4 (octets)
2. sizeof (type)
Exemples
typedef char tab[100];
tab t;
int n;
n = sizeof(int), -> 2 ou 4 (octets)
n = sizeof(tab) -> 100 (char)
Techniques de Programmation 57/102
Programmation en C
Opérateurs divers
( ) force l'ordre des calculs
ex : 1 + 2 * 3 -> 7
(1+2) * 3 -> 9
[ ] pour les tableaux
t[2] équivalent à *(t+2)
-> et . (opérateurs sur structures, à étudier + tard)
Techniques de Programmation 58/102
Programmation en C
Priorité des opérateurs
Priorité Opérateurs Description Associativité
15 () [ ] -> . opérateurs d'adressage Gauche
++ -- incrément/décrément
~ complément à un (bit à bit)
! non unaire
14 Droite
&* adresse et valeur (pointeurs)
(type) conversion de type (cast)
+- plus/moins unaire (signe)
13 */% opérations arithmétiques Gauche
12 +- "" Gauche
11 << >> décalage bit à bit Gauche
10 < <= > >= opérateur relationnels Gauche
9 == != "" Gauche
8 & et bit à bit Gauche
7 ^ ou exclusif bit à bit Gauche
6 | ou bit à bit Gauche
5 && et logique Gauche
4 || ou logique Gauche
3 ?: conditionnel Droite
= += -= *= /= %=
2 assignations Droite
>>= <<= &= ^= |=
1 , séparateur Gauche
Techniques de Programmation 59/102
Programmation en C
Priorité des opérateurs (exercices)
main(){
int x, y , z;
x = 2; x =0 ; y =0; z=0;
x += 3 + 2; printf("%d\n",x); x+=y+=z;
x -= y = z = 4; printf("%d%d%d\n",x,y,z); printf("%d\n", x < y ? y : x) ;
x = y == z; printf("%d%d%d\n",x,y,z); printf("%d\n", x < y ? x++ : y++) ;
x == (y = z); printf("%d%d%d\n",x,y,z); printf("%d, %d\n", x , y);
printf("%d\n", z += x < y ? x++ : y++)
x = 3; y =2 ; z = 1; ;
x = x && y || z ; printf("%d\n", x); printf("%d, %d\n", y , z);
printf ("%d\n", x || ! y && z);
x = y = 0; x = 3; y = z = 4;
z = x ++ -1; printf ("%d, %d\n", x, z); printf("%d\n",( z >= y >= x) ? 1 : 0)
z += -x ++ + ++ y; printf ("%d, %d\n", x, z); ;
printf("%d\n", z >= y && y >= x ) ;
x =1 ; y =1; x = y = z = 0;
printf("%d\n", ! x | x); }
printf("%d\n", ~ x | x);
printf("%d\n", x ^ x);
x <<= 3 ; printf("%d\n", x);
y <<= 3 ; printf("%d\n", y);
y >>= 3 ; printf("%d\n", y);
Techniques de Programmation 60/102