LE LANGAGE C D nition de la norme ANSI e

Jean Louis Nebut IFSIC Cours C81 R vis juillet 94 e e

Table des mati

res e
1 INTRODUCTION
1.1 Caract ristiques du langage e 1.2 Commande de compilation 1.3 Le niveau lexical 1.3.1 Les s parateurs e 1.3.2 Les commentaires 1.3.3 Les identi cateurs 1.3.4 Les nombres 1.3.5 Les cha^nes
1.3.6 Les symboles 1.4 Structure d'un programme 1.5 R

3 Les types caract.1.2 Les types r els e 2.1 Les types de base 2.1 Les types entiers 2. CONSTANTES ET VARIABLES 2.1.gles de pr sentation de la syntaxe e e 1 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1 1 1 2 2 2 2 2 3 3 3 2 TYPES.1.

6 3.3 3.1.5 Les constantes 2.2 3.2 Le type des valeurs bool ennes e 2.7 3.4 Le type void 2.8 3.2 4.3 Les types num r s e ee 2.res e 2.10 4.6 D claration de variables e : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 5 5 6 6 7 7 7 7 8 8 3 LES EXPRESSIONS 3.4 4 ENTREES-SORTIES Expressions arithm tiques e Expressions logiques Expressions relationnelles Expressions de manipulation de bits Les op rateurs d'a ectation e Les conversions implicites Les conversions explicites : le forceur L'expression conditionnelle Appel de fonction Priorit des op rateurs e e Lecture- criture d'un caract.4 3.5 3.1 4.3 4.4 Les d nitions de type e 2.9 3.1 3.

re e e Lecture- criture d'une ligne e Ecriture format e e Lecture format e e 11 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 11 11 12 12 12 13 13 14 14 15 17 17 18 19 17 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : i .

ii 4.5 Lectures et tamponnage du clavier .

13 Instruction-expression Instruction compos e.11 5.5 5. ou bloc e Instruction tantque Instruction r p ter ee Instruction si Instruction cas Instruction vide Instruction pour Composition s quentielle d'expressions e Instruction aller.1 5.7 5.12 5.2 5.6 5.3 5.9 5. TABLE DES MATIERES : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 20 5 LES INSTRUCTIONS 5.8 5.10 5.4 5.

2 7.11 8.1 8.2 8.2 6.5 7.9 D nition e Op rateurs de prise d'adresse e D clarateur de pointeur e Op rateur d'adressage indirect e Op rateurs sur les pointeurs e Type d'un pointeur universel Pointeurs et indexation D claration de pointeur et d clarateur de tableau e e Les op rateurs d'incr mentation et de d cr mentation e e e e Tableaux et pointeurs Exercices D claration de fonction e Visibilit des objets e Valeur d livr e par une fonction e e Mode de transmission des param.7 7.4 7.3 8.5 6.4 8.6 8.1 6. a Instruction de sortie Instruction continuer Exercice 21 21 21 22 22 23 23 24 24 25 25 25 26 26 27 28 28 28 29 29 31 31 31 32 32 33 33 34 35 35 36 37 38 38 38 40 40 41 42 42 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 6 LES TABLEAUX 6.6 7.3 6.1 7.10 7.6 D claration d'un tableau e Identi cateur de tableau Op rateur d'indexation e Initialisation d'un tableau Les cha^nes Exercice 27 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7 LES POINTEURS 7.9 7.4 6.8 8.7 8.8 7.3 7.5 8.

tres e Les param.

tres r sultat e e Param.

tres tableaux et pointeurs e Les fonctions en param.

tre e Les arguments de main Exercices 31 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8 LES FONCTIONS 37 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : .

.

6 Fonctions externes 9.3 Ordre des d clarations dans un module e 9.3 Attribut des variables 9.3 Variables externes 9.5 Fonctions globales 9.2 Prototype de fonction 9.4 Fonctions locales au module 9.1.1.1 Composition d'un module 9.1.1 Composition d'une fonction 9.3.3 Articles en param. TABLE DES MATIERES iii 9 STRUCTURATION DES PROGRAMMES 9.1.1 Le type structure 10.1.2 Op rateurs sur les types structures e 10.2 Variables globales 9.3.1.3.4 Exercice 10.2 R sum sur l'organisation des donn es e e e 9.1 Variables locales du module 9.

9 Les unions 10.7 Taille d'un article : op rateur sizeof e 10.10Exercice 45 45 45 45 46 46 46 46 46 47 47 48 48 48 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 10 LES ARTICLES 51 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 51 51 52 52 53 53 54 54 55 55 57 58 58 59 59 59 60 60 60 61 61 61 61 62 62 62 .8 Les articles tass s e 10.6 Pointeurs sur les articles 10.tre e 10.4 Fonctions de type article 10.5 Initialisation des articles 10.

11 LES FONCTIONS DES BIBLIOTHEQUES STANDARD 11.2 Les manipulations de zones de m moire e 11.3 Les fonctions de test ou de transformation de caract.1 Les manipulations de cha^nes 11.

4.3.4.1 Ouverture et Fermeture 11.re e 11.4 Les entr es sorties et les chiers e 11.3 Acc.1 Les conversions 11.4.2 Fin de chiers et erreurs 11.

s s quentiel par caract.

4.4 Acc.re e e e 11.

s s quentiel par ligne compl.

te e e e 11.4.5 Acc.

4.s s quentiel avec format e e 11.6 Acc.

2 Directives de compilation conditionnelle 12.4.4.2 Op rateur  e 12.1 Op rateur  e 12.1 Directive de ne 12.4 Identi cateurs pr d nis ee 63 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 63 63 64 64 64 65 .s direct e 11.10Relations avec UNIX 11.7 Manipulation des chiers 11.4.8 Allocation dynamique 11.1.1.3 Directive d'inclusion 12.9 Fonctions Math matiques e 11.4.5 Exercice : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 57 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 12 LE PRE-COMPILATEUR 12.

iv .

TABLE DES MATIERES Constante Type Variable Instructions A.5 B.1 S lections e A.4 A SCHEMAS DE TRADUCTION LD EN C : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 67 67 67 67 67 68 68 69 71 71 72 73 74 75 77 B CORRIGES DES EXERCICES B.2 It rations e A.3 A.4.2 A.4 B.3 B.1 B.6 B.2 B.5 Sous-programmes Chapitre 5 Chapitre 6 Chapitre 7 Chapitre 8 Chapitre 9 Chapitre 10 Chapitre 11 A.4.7 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 71 .1 A.

Chapitre 1 INTRODUCTION Conu initialement pour crire le syst.

c'est un langage tr.me UNIX.

les op rations sur les bits et d'adresser les objets par les fonctions d'adressage de base e e adressage direct. index . bien que les variables et les param. e Ce n'est pas un langage de haut niveau qui met en avant une stricte notion de type.s proche des capacit s d'un c e e e e calculateur des ann es soixante dix : il permet de mettre en uvre les op rateurs du mat riel les e e e d calages. indirect.

c'est un langage pour sp cialistes : il faut bien comprendre les m canismes e e d'adressage. qui joue le r^le d'un macro-processeur l' quivalent d'un macroe o e assembleur pour un langage d'assemblage : substitution de cha^nes. il faut avoir assimil correctement le travail d'un compie lateur et d'un diteur de liens pour d couvrir ce que ces logiciels peuvent laisser comme erreurs de e e programmation. e Comme l'assembleur. e e Il n'y a qu'un seul niveau de d claration de sous-programmes qui ne peuvent donc pas s'embo^ter. L'appel du compilateur cc ou gcc sous UNIX pour compiler un programme complet met en jeu trois logiciels : d'abord un pr -compilateur. et en particulier l'indirection.tres soient typ s. L'allocation des variables locales est automatique. traitement de la compilation conditionnelle. expansion des macros. L'option -E permet d'arr^ter l. e mais plusieurs niveaux de d claration de variables.

L'alphabet e . e e Il n'y a pas possibilit de demander un listing de compilation. e puis le compilateur en n l' diteur de liens.out ou xx avec l'option -o xx . le traitement pr e a e compilation seule. qui engendre l'ex cutable a. les nombres et les cha^nes. e Il y a trois sortes d'entit s lexicales : les identi cateurs. r sultat sur la sortie standard.

utilis comprend les caract.

res du jeu de caract.

res du calculateur. A l'IFSIC. il s'agit du jeu ASCII e e e a .

128 caract.

et des jeux ISO-Latin .res pour les identi cateurs.

256 caract.

res sous UNIX et ASCII e a e tendu .

256 caract.

res sous MS DOS pour les commentaires et les cha^nes. ee e e Par convention historique. e ee 1 1.2 Commande de compilation 1.1 Caract ristiques du langage e 1. on r serve les majuscules pour les identi cateurs d nis au niveau du e e pr -compilateur et pour les identi cateurs de type non pr d ni. comme sous UNIX. e a e Les minuscules et les majuscules sont consid r es comme tant di rentes.3 Le niveau lexical .

e e e 1.2 CHAPITRE 1.1 Les s parateurs e 1.3. ils servent de s parateurs d'entit s lexicales.3.2 Les commentaires C'est une suite de caract. INTRODUCTION Les espaces. tabulation et retour de ligne sont ignor s.

3 Les identi cateurs Un identi cateur est compos d'une lettre. ventuellement suivie d'une suite de lettres et de e e chi res.res quelconques incluant les changements de ligne encadr e par les e e s quences * et * e 1. Le caract.3.

re soulign est consid r comme une lettre. mais son usage en premi.

re position n'est e e ee e pas conseill le compilateur ajoute un soulign devant les identi cateurs d'objets externes transmis e e a e .

l' diteur de liens. Deux identi cateurs doivent se di rencier par leurs 31 premiers caract.

en e e e octal. suite de chi res hexa c e e commenant par 0x. e e Exemple :entier lu Les deux derniers identi cateurs sont di rents.4 Les nombres Les entiers peuvent s' crire en d cimal : suite de chi res dont le premier n'est pas z ro . Le signe plus unaire a t c e eee ee introduit par la norme C. ou en hexad cimal. Un nombre n gatif est pr c d d'un signe moins. soit une partie exposant pr c d e de la lettre e e eee e. suite de chi res octaux commenant par un z ro . Leur syntaxe est : R. e dernier mot mot1 Mot1 1. Les nombres r els comprennent soit un point d cimal.3.res.

gle e Exemple :129 012 Ox1a ou Ox1A -192 partie enti.

re e . partie d cimale e e exposant La partie enti.

5 Les cha^nes Exemple : n Une cha^ne est une suite de caract.re ou la partie d cimale est obligatoire. le point ou l'exposant est obligatoire.18 -3.3.14156 18e-2 1. e e Exemple :.

Un guillemet dans une cha^ne est not n" e "Ceci est une tr.res ne comprenant pas de retour de ligne et encadr par des e e guillemets.

e alors on met un devant le retour de ligne pour l'annuler .s longue cha^ne qui ne tient pas sur une ligne. le " est aussi pr c d d'une contre-barre" e e e n n n La norme C accepte galement de couper une cha^ne par un retour de ligne .

condition d'entourer e a de guillemets toutes les parties de la cha^ne : c'est le pr -compilateur qui regroupera les di rentes e e cha^nes adjacentes. Exemple : "Voila le premi.

re partie." ." e "et voici la seconde.

4.3.1. Ce sont : e register return short signed sizeof static struct volatile switch while typedef union unsigned void La plupart des caract.6 Les symboles auto break case char const continue default do double else enum extern oat for goto if int long ::: Certains identi cateurs servent de mot-cl . STRUCTURE D'UN PROGRAMME 3 1.

res non lettres ou chi res et leurs associations servent galement de symboles e e op rateurs. f g   ^ : . d limiteurs  : e e +. C ne connait que la notion de sous.  ++ ..  = !? & j ~ . == jj && != *= = += = = = &= ^= = = = Il n'y a pas de notion de programme a proprement parler. .

programme. restreint .

la notion de fonction dans les premi.

et le compilateur connait a e la notion de module. Ce qu'on appelle habituellement "le programme" est donc en C une proc dure dont le nom est main . L' diteur e de liens lui sait fabriquer un ex cutable lorsque l'un des identi cateurs d'externes fabriqu s par le e e compilateur s'appelle main . ensemble de variables globales ou locales au module et de fonctions. e La structure la plus simple .res versions.

4 Structure d'un programme contente d'a cher un message ressemble . Elle est la suivante : 1. donner au compilateur est un module compos d'une seule proc dure a e e qui s'appelle main .

Mais ce n'est pas su sant. un programme qui se e e void main  fprintf "coucou !" g *Affiche coucou !* . car le compilateur ne connait pas le sous-programme d'a chage printf : il fait partie d'une biblioth. Ainsi. : a void main  f les d clarations locales e les instructions g Le mot-cl void permet de distinguer une proc dure d'une fonction.

Aucune entr e-sortie n'est d nie e .que qu'il faut indiquer a la compilation.

mais il existe plusieurs biblioth. e e en C.

ques standard. Chaque r. e La grammaire du langage est pr sent e ici sous une notation BNF modi e.

gle est e e e e pr c d e du mot R.

les symboles du m talangage sont en criture eee e e e e e haute et ont comme signi cation : : s pare le nom de la r.gle . les mots-r serv s sont en gras.

gle de la r.

gle elle-m^me e e e e f g parenth.

se de groupage e 1.5 R.

gles de pr sentation de la syntaxe e e .

INTRODUCTION alternative entit optionnelle e entit qui doit ^tre pr sente une fois ou plus e e e entit qui peut ^tre r p t e z ro fois ou plus e e e ee e .4 j +  CHAPITRE 1.

CONSTANTES ET VARIABLES Les objets C peuvent ^tre de plusieurs types : e d'un des types de base pr d nis dans le langage ee d'un type num r e ee d'un type article d'un type union article en recouvrement ou d'un type d ni dans une d nition de type e e R.Chapitre 2 TYPES.

e ee e 2.1. les types e e num r s et les d nitions de type.1 Les types entiers R.1 Les types de base 2.gle e type : type de base j type structure j type union j type num r j type d ni e ee e On remarque qu'on ne parle pas ici de type tableau ni de type pointeur : les notions syntaxique et s mantique de type sont distinctes en C. On tudie dans ce chapitre les types de base.

gle e Ils sont au nombre de quatre : entier. r el. caract.

re. selon la syntaxe suivante. en fonction de la "taille" des valeurs : : f signed j unsigned gf short j long g int int valeurs enti. e e Il y a six types entiers. et vide.

231 . en g n ral de la taille des registres de la machine. Sur SUN et e e ee HP.res sign es. les valeurs de type int sont cod es sur 32 bits et vont de .

le codage est sur 16 bits .215 . +231 . Sur PC e a Turbo-C. 1.

a e short int entiers courts sign s. Abr viation pour signed int. +215 . cod s sur deux octets : de .215 . 1.

32 768 a +32 767. +215 . 1 . e e a .

e e 5 type entier . Pas de di rence sur PC. Abr viation pour signed short int.

CONSTANTES ET VARIABLES short identique a short int .6 CHAPITRE 2. TYPES.

long int entiers longs sign s; cod s comme int sur 32 bits sur HP, SUN3 et 4 et PC. Les litt raux e e e de type long sont suivis de la lettre l ou L : 0l est le 0 long, 124L est la valeur 124 de type long. Certaines fonctions des biblioth

ques pr d nies ont des param

tres long. e ee e Abr viation pour signed long int. e long identique a long int.

unsigned int valeurs enti

valeurs de 0 a 232 . 1 . de la taille d'un registre. Cod es sur 32 bits sur SUN et e e e HP.res non sign es.

unsigned identique a unsigned int .

de 0 . unsigned short int valeurs cod es sur deux octets.

65 535 e a unsigned short identique a unsigned short int .

unsigned long int valeurs longues positives unsigned long identique a unsigned long int .

ayant au moins sept chi res signi catifs et e e e une puissance de dix de 38 au maximum double r el cod sur huit octets "double pr cision". Il y a trois types r els : e oat r el cod sur quatre octets "simple pr cision". avec quinze chi res signi catifs et une puise e e sance de dix jusqu'.

306 a long double pour extension future Les litt raux r els sont th oriquement toujours consid r s comme tant double.1.1. e e e ee e 2.2 Les types r els e 2.3 Les types caract.

res e Il y en a deux : char il sert a coder les valeurs du jeu de caract.

mais il est en fait identique .res ASCII restreint.

e a .

short int cod sur un octet. Ses valeurs vont donc de 128 .

mais les litt raux e a e caract. +127.

res imprimables ont une notation particuli.

re plus loin e e unsigned char recouvre les valeurs enti.

res de 0 .

permettant ainsi le codage de l'ISO-Latin e a et de l'ASCII tendu. 255. e Les litt raux de type caract.

sauf pour l'apostrophe. Les caract.re et qui ont une repr sentation graphique se notent par cette repr sene e e e tation plac e entre apostrophe. le guillemet et la contrebarre.

res e e non a chables ont une notation particuli.

re.' 'A' notation particuli. e notation normale : 'a' ' .

re : e 'nn' caract.

re NL e nouvelle ligne 'nr' caract.

re RET e retour chariot 'nb' caract.

re BS e retour arri.

re e 'nt' caract.

re TAB e tabulation 'nv' caract.

re VT e tabulation verticale 'nf' caract.

re FF e saut de page 'n"' caract.

re guillemet e 'n' caract.

re quote e 'nn' caract.

tout caract.re contre barre e En n.

re de code octal nnn ou de code hexa nn peut ^tre d not par 'nnnn' ou 'nxnn'. e e e e .

Par convention.2 Le type des valeurs bool ennes e Il n'y a pas en C de type bool en. 2.1.2. LE TYPE DES VALEURS BOOLEENNES 7 2.4 Le type void Le type void est le type des sous-programmes qui ne rendent pas de valeurs type des fonctions qui s'utilisent comme des proc dures. e e toute valeur enti. Par contre. e 2. les expressions bool ennes existent.

re peut ^tre consid r e comme une valeur bool enne. en suivant la r.

3 Les types num r s e ee R. e 2.gle : e e ee e e faux est cod par un entier nul e vrai est cod par un entier non nul.

mais enum jour * lun est cod par 0. * * enum priorite fbasse = grande. dim par 6 * e normale "vaut" 0. e type num r e ee enum identi cateur . . 2. super = 10g . ces valeurs sont cod es par d faut par 0.1. ee ::: fidenti cateur  = init g. dim .2. Les autres identi cateurs sont les valeurs du type . sauf si une expression d'initialisation vient modi er ces valeurs. Le e e codage normal valeur pr c dente +1 reprend en l'absence d'initialisation. le point virgule doit ^tre pr c d des e e eee variables du type type anonyme.gle e Dans un type num r . mer. sam. ven. identi cateur : Le premier identi cateur d signe le type . * attention. = init Exemple : enum jour flun. le type n'est pas jour. moyenne = 5. jeu. le codage des valeurs du type est r alis par des identi cateurs qui e ee e e d signent alors des constantes. quand il est omis. grande vaut 6 * mar. normale. g -1.4 Les d nitions de type e typedef R.

jour n'est pas consid r comme un nouveau type.gle e Quand on a d ni le type enum jour f g. e ee Une d nition d'un type que l'on veut d signer par un identi cateur se fait gr^ce .

Un d clarateur compl. une d claration e e a a e ::: type d ni e Exemple : typedef int LONGUEUR * une LONGUEUR est cod e par un entier * e typedef enum ffaux. vraig BOOLEEN .

e : . e .te la s mantique du type. typedef type d clarateur . et en m^me temps. donne le moyen de d signer le e e e e e type. Le d clarateur le plus simple est un identi cateur.

CONSTANTES ET VARIABLES Le type BOOLEEN ainsi d ni correspond bien . TYPES.8 CHAPITRE 2.

la convention annonc e : faux est cod par 0. 1 ici. On remarque qu'on ne peut pas a ner les types entiers ou caract. et vrai e a e e par une valeur non nulle.

res e par des intervalles. 2.5 Les constantes R.

e e et pour corps le litt ral. Pour d signer un tel litt ral par un identie e e cateur. on utilise le pr -compilateur. Cette expression doit ^tre calculable e e e a . en d clarant une macro qui a pour nom l'identi cateur choisi.gle e Le langage C ne connait que les constantes litt rales. ou l'expression de constante ad quate.

d claration de macro pour le pr -compilateur : e e  de ne identi cateur identi cateur . identi cateur   texte La liste d'identi cateur entre parenth. la compilation.

se est une liste de param.

tres formels pour les macros qui sont e e des instructions. le  doit ^tre en premi. Attention !.

et il se termine par une n de ligne. Le texte peut contenir des blancs.re colonne. il n'y a pas d'espace avant le de ne dans les e e anciennes versions de C. Toute occurrence de l'identi cateur sera substitu e lors de la pr -compilation e e par le texte qui lui est associ . e Exemple :  de ne MAXCAR 20  de ne MAXTAB 30  de ne PLACETAB MAXCAR * MAXTAB On ne peut pas mettre de commentaire sur une ligne de ne sans le voir r appara^tre .

chaque e a substitution de la macro! Les parenth.

ses ne sont pas forc ment n cessaires. mais elles sont souhaie e e tables penser .

une expression comme x PLACETAB : sans les parenth.

ses.6 D claration de variables e Une d claration de variable d nit . le macro-processeur la a e remplacera par x 20*30 . ce qui n'est pas ce qu'on attend. 2.

la fois : e e a le nom de la variable le nom de son type son type. c'est-. qui est obtenu en combinant le nom de son type et une information suppl mentaire e contenue dans le d clarateur e sa classe d'allocation.

-dire comment est allou e la variable. a e  R.

Comme on l'a d j.gle e d claration de variable : e classe type d clarateur-init e . d clarateur-init e .

le d clarateur le plus simple est un identi cateur le nom de la variable. Un ea e d clarateur-init est un d clarateur avec valeur initiale. e e R. dit.

gle e d clarateur-init : e d clarateur = init e .

mar. b. * seul pasla est initialis a vrai * e. DECLARATION DE VARIABLES 9 Exemple : int a. pasla = vrai . enum jour j . 2. c * e e * j peut prendre les valeurs lun. c . * trois entiers d sign s par a. BOOLEEN trouve.6. b.

dim * La classe d'allocation sert ... .

la fois .

dire o.

est allou e la variable et quelle est sa port e. soit implicitement dans le cas des e variables globales valeur initiale nulle pour les variables de classe extern et static.1. tandis qu'une variable d clar e en e e e e e dehors d'une fonction est d clar e dans un segment de donn es permanent. a a u e e e une variable d clar e dans une fonction est allou e sur la pile. Les variables sont initialis es soit explicitement par = init.3. Cette notion est examin e e e e e dans le chapitre concernant la structure des programmes paragraphe 9. . Par d faut.

CONSTANTES ET VARIABLES . TYPES.10 CHAPITRE 2.

les parenth. mais attention.Chapitre 3 LES EXPRESSIONS Il y a quarante cinq op rateurs r partis en quinze classes de priorit s di rentes en C. Ces op e e e e e rateurs permettent une norme puissance d'expression.

ses sont souvent e e indispensables malgr le nombre des priorit s. e e Certains op rateurs servent .

d'autres servent . combiner des valeurs.

e Il est n cessaire de consulter le tableau des priorit s tout en lisant ce chapitre page 15. On e a a e n' tudie dans ce chapitre que les premiers.1 Expressions arithm tiques e Les op rateurs sur les types entiers et caract. r aliser des adressages. e e 3.

plus le moins et le plus unaire.res sont : +.0 5 donne 0. mais le compilateur peut e e e e e tenir compte de la commutativit de l'addition et de la multiplication. . Ainsi. dans fa + fb . e e e e e A priorit s gales. * et . les op rateurs sont valu s de la gauche vers la droite. Les op rateurs sur les r els sont : +.6. et  modulo. ce qui interdit . . Seul le moins e e unaire existe dans les versions de C datant d'avant la norme. Ainsi. e fa ou fb peut ^tre valu d'abord. 3 5 donne 0 e e tandis que 3. *. Les divisions par z ro et les e e e e e d bordements sur les r els sont d tect s ou non selon les compilateurs et selon les ex cutifs C. Les d passements de capacit ne sont pas d tect s sur les entiers. .

f d'avoir un e et de bord. e e e a Exemple : x + y * 3 .'a' + 10 3. Ce sont : e ! n gation e && et logique jj ou logique Les op rateurs && et jj sont .a + 3 * z carlu .2 Expressions logiques Les op rateurs logiques s'appliquent sur des op randes entiers positifs puisqu'il n'y a pas de type e e bool en.

circuit court : le deuxi.

Ainsi. b n'est valu que si a est e e e vrai c'est .me op rande n'est valu que si c'est e a e e e e indispensable pour le calcul du r sultat. dans l'expression a && b .

dire non nul. a Exemple : !3 vaut 0 !5 jj x vaut 0  ! est plus prioritaire que jj 11 .

3 Expressions relationnelles Exemple : carlu carlu = 'a' && carlu = 'A' && carlu = 'z' || = 'Z' CHAPITRE 3. LES EXPRESSIONS Les op rateurs de relations n'ont pas tous la m^me priorit : l' galit et la di rence sont moins e e e e e e prioritaires que les autres. Ce sont : == et != galit et di rence e e e = = comparaisons est vrai si carlu est une lettre. Les priorit s sont telles que les parenth.12 3.

e e Les op randes sont des entiers trait s comme des cha^nes de bits.ses sont inutiles. ~ compl ment . Les op rateurs correspondent e e e aux instructions-machine sur les mots.

1 inversion des bits e a d calage a gauche : des z ros entrent a droite e .

e .

logique pour les op randes unsigned e . d calage a droite. arithm tique pour les op randes int.

ou des z ros entrent a gauche e . e e e extension de signe.

& et bit .

bit a j ou inclusif bit a bit .

^ ou exclusif bit a bit .

une a ectation est une expression qui a comme valeur l'expression a ect e . Dans un d calage.5 Les op rateurs d'a ectation e En C. l'op rande droit doit ^tre positif et inf rieur au nombre de bits d'un mot-machine.4 Expressions de manipulation de bits 3. e e e e 31 31 31 Exemple : 31 31 31 31 && 4 vaut 1 31 = 00011111 & 4 vaut 4 4 = 00000100 jj 4 vaut 1 j 4 vaut 31 ^ 4 vaut 28 4 vaut 1 4 vaut 496 3.

l'op rande gauche est galement une expression qui d signe une variable. l'op rande e a e gauche. e e e On l'appelle identi cation dans les r. Syntaxiquement.

gles : e R.

et la variable d sign e reoit la valeur de l'expression de droite. apr.gle e expression d'a ectation : identi cation = expression L'expression de droite et l'expression de gauche l'identi cation de la variable sont valu es dans e e n'importe quel ordre.

e Il existe une deuxi.s conversion e e c e ventuelle.

me forme : e .

6. LES CONVERSIONS IMPLICITES R.3.

ils e e e sont associatifs de gauche .gle e 13 expression d'a ectation : identi cation op = expression op : + j j* j j j j j & j^ jj identi cation op= expression est une abr viation pour : e identi cation = identi cation op expression mais l'identi cation de la variable n'est calcul e qu'une fois . en particulier. Les op rateurs d'a ectation ont une priorit plus faible que tous les op rateurs vus jusqu'ici. le r sultat d'une fonction e e peut servir dans une identi cation.

la valeur de gauche est convertie dans e e le type de la variable de droite selon les r. si bien que : a x = y = z est valu comme : e e x = y = z Exemple : x += 2 y &= 0xFF x = 3 + y = 2 * * * soit x = x + 2 * masque sur l'octet de poids faible * x vaut 5 et y vaut 2 * Si les deux op randes d'une a ectation n'ont pas le m^me type. droite.

e 3.6 Les conversions implicites Dans l' valuation d'une expression.gles de conversions implicites. La r. des conversions automatiques ont lieu si deux op randes d'un e e op rateur ne sont pas du m^me type. e On verra plus loin deux autres op rateurs d'a ectation.

gle est que le type "le plus fort"l'emporte. c'est a dire celui e e e .

int est converti en long s'il y a un unsigned.7 Les conversions explicites : le forceur R. short et enum sont convertis en int 3. int est converti en unsigned char. oat est converti en double s'il y a un oat. qui contient la plus grande valeur absolue : s'il y a un double. int est converti en oat s'il y a un long.

gle e Un forceur est une expression qui transforme une autre expression en une valeur d'un type donn : e forceur : type expression .

LES EXPRESSIONS Si le type r cepteur est "plus fort" que le type de l'expression. il n'y a pas de probl.14 CHAPITRE 3.

il y a troncature d'un entier en short par exemple. Dans l'autre e e sens.me. Exemple : y = 3 * sqrt  doublex * sqrt attend un param.

tre double * e 3.8 L'expression conditionnelle Cette expression utilise l'op rateur ternaire ? : e R.

gle e L' valuation se fait ainsi : e valuation de l'expression1 e si elle est non nulle. valuation de expression3. 3. z la valeur 1 et x la valeur 1 * : b z = 1 On verra un autre exemple au paragraphe 4.9 Appel de fonction R. qui est la valeur de l'expression conditionnelle. valuation de expression2 qui est la valeur de l'expression conditionnelle e sinon. e expression conditionnelle : expression1 ? expression2 : expression3 Exemple : * * * calcul du max de a et b * max = a b ? a soit z = 4 * x = y = 3 z ? z = 2 : y prend la valeur 3.3.

expression  Le plus souvent. L'ordre d' valuation des expressions param. e Appel de fonction : expression  expression . La e e d signation de la fonction est syntaxiquement aussi une expression. la fonction est d sign e par un identi cateur mais on peut avoir des tableaux de e e fonctions et des pointeurs sur des fonctions.gle e Un appel de fonction est une expression qui a comme valeur la valeur d livr e par la fonction.

tres e ectifs e e est quelconque. Les param.

tres e ectifs sont convertis dans le type du param.

tre formel. ou. les conversions suivantes sont r alis s : e e un param. si celui-ci e e n'est pas connu.

tre e ectif oat est converti en double e un char ou un short est converti en int un unsigned char ou short est converti en unsigned int. On remarquera qu'un appel de fonction sans param.

tre comporte les parenth.

ses. *  est erron le code engendr est faux. l'appel f. e e il faut crire f* e . mais cela ne provoque pas d'erreur de compilation. Si f est une fonction e e de type void.

plusieurs op rateurs ayant m^me priorit tant regroup s e e e ee e entre deux traits horizontaux. class s par priorit e e e e d croissante les plus prioritaires en haut. La troisi.10. 3. Le tableau suivant pr sente e l'ensemble des op rateurs certains seront vus dans des chapitres ult rieurs. PRIORITE DES OPERATEURS 15 On ne donne pas la grammaire des expressions. qui est fastidieuse.

me colonne indique le sens de l'associativit de ces op rateurs. e e e En cas de doute. utilisez les parenth.

ses ! e Op rateur e  Usage Associativit e Appel de fonction indexation acc.

s .

! acc. un champ via pointeur e a .

s .

un champ e a moins unaire plus unaire incr mentation e d cr mentation e e non logique compl ment a un e .

! modulo addition . .! di rence e et bit a bit .! soustraction d calage gauche e .! plus grand plus grand ou gal e galit e e .! d calage droit e plus petit plus petit ou gal e . indirection prise d'adresse taille d'un objet forceur multiplication division .

! ou exclusif bit . .

! ou bit . bit a .

3. bit a . ^=. op rateurs d'a ectation e &=. = = . . j =. . = = == != & ^ j && jj ?: =. =. sizeof type *  + . =.! expression conditionnelle . +=. .! et logique .10 Priorit des op rateurs e e . *=. . .. s quence d'expressions e . ! ~ * & + ++ . .=.! ou logique .

16 CHAPITRE 3. LES EXPRESSIONS .

Il existe une e e e biblioth. pas plus que la notion de chier.Chapitre 4 ENTREES-SORTIES Aucune op ration d'entr e-sortie n'est d nie en C.

e L' diteur de liens se charge d'aller chercher cette biblioth.que de fonctions et de constantes qui d nit un type chier et des op rateurs sur l'entr e et e e e e la sortie standard d'UNIX ou MS DOS. on ne voit que les op rateurs les plus e usuels sur l'entr e et la sortie standard. Dans ce chapitre.

h 4. On inclut ce chier dans un module qui fait des entr es-sorties en plaant e c la directive au pr -compilateur : e include stdio.que si le compilateur le lui demande. e e Le compilateur a besoin de plusieurs d nitions qui sont regroup es dans un chier du r pertoire e e e usr include sous UNIX.1 Lecture- criture d'un caract.

re e e getchar Fonction de type int qui d livre le caract.

une constante d nie dans le chier stdio. sur l'entr e e e e standard. La fonction d livre EOF .h .re suivant lu au clavier en fait. lorsque e e le caract.

re lu est en fait la marque de n de chier. La valeur de EOF n'est pas en g n ral e ee une valeur du type char. d'o.

La n de chier s'obtient en tapant u un ^D au clavier sous UNIX. ou un ^Z sous MS DOS. le type de la fonction. Fonction qui s'emploie comme une proc dure pour ajouter le caract.

c = getchar . * * * putcharc Exemple : char c . n On ne teste pas la n de chier * Lecture d'un caract. putchar' n' .re c sur le chier e e standard de sortie.

La e e fonction d livre NULL si la n de chier est rencontr e e e A che la cha^ne ch sur la sortie standard. la e e e marque de n de ligne est remplac e par une marque de n de cha^ne dans le r sultat.re. en remplaant la n de cha^ne par une n de c ligne. avec cho * e e A chage d'un retour de ligne * 4. 17 putsch .2 Lecture- criture d'une ligne e gets Fonction de type pointeur sur cha^ne qui d livre la ligne tap e sur l'entr e-standard .

18 4. e . : : :. e1.3 Ecriture format e e printf format. ENTREES-SORTIES : : :. caract. e . les types des expressions sont : entier. e e CHAPITRE 4. r el. en a che les expressions 1 2 e n en fonction du format indiqu une cha^ne . e2.

re ou cha^ne. e ee e La syntaxe d'une sp ci cation de format est la suivante : e R. printf a che la cha^ne contenue dans le format en remplaant c c chaque sp ci cation de format par l'expression interpr t e selon la sp ci cation. Pour chaque i correspond dans le format une sp ci cation e e e de format commenant par un  .

gle e  L .d l conversion Conversion indique quelle est la conversion .

a obligatoire : d ou i entier sign en base 10 e o entier non sign en octal e u entier non sign en base 10 e x ou X entier sign en base 16. lettres en minuscules ou en majuscules e c caract. faire vers le type cha^ne a chable. C'est une lettre.

6 chi res d cimaux e Le signe apr.re e s cha^ne f r el imprim sous forme d cimale xxx.yyyyyy 6 chi res par d faut e e e e e ou E r el imprim sous forme e e x.yyyyyyezz e ou E.

cadrage e .s le  indique un cadrage a gauche dans le champ de longueur L par d faut.

e a .

Si l'expression occupe moins de L caract. droite.

elle est pr c d e de blancs. ou de z ros si e eee e L commence par un z ro.res. Si l'expression occupe plus de L caract.

En absence de L. sauf ventuellement avec la conversion s. l'expression occupe autant de e caract.res. le champ est tendu pas de e e e troncature.

res qu'elle en contient. e d est un entier qui indique le nombre de chi res apr.

s la virgule pour les conversions e et f. et e la longueur de la cha^ne .

e Appel e comme une fonction. pour la conversion s. ae e l est la lettre l si l'entier est long ou si le r el est double. printf d livre le nombre de caract. crire. et c'est la lettre h si l'entier est short. entra^nant ventuellement une troncature.

x.y. L'appel : printf "Affichage : d = x en hexa.x .5s !". y un r el qui vaut 135. ou EOF  ! en cas e e e e d'erreur.2f et : -10. ch une cha^ne qui vaut e "une petite cha^ne".6. Exemple :1 x est un entier qui vaut 31.9385. a chera sur une seule ligne pas de caract.res crits. x.

La variable nbchaise est a ch e avec la sp ci cation d . nbchaise.res 'nn' dans le format : e A chage : 31 = 1f  en hexa. 135.93 et :une  p ! 2 Mettre l's du pluriel : printf"Il y a d chaisec nn". nbchaise 1 ? 's' : ' ' . et le caract.

e e .re r sultat de l'expresssion e e e e conditionnelle est a ch avec la sp ci cation c le s ou rien.

a1 .2. l'adresse est obtenue en faisant pr c der l'identi cateur par un "et commercial" Voir plus loin paragraphe 7. LECTURE FORMATEE 19 lit sur l'entr e standard des valeurs suivant le format indiqu . : : :.4.4 Lecture format e e scanf format. a : a  * L l conversion Conversion indique quelle est la conversion . Pour chaque i doit ee correspondre dans la cha^ne format une sp ci cation de format commenant par un . a2 . an 4. La syntaxe e c d'une sp ci cation de format est la suivante : e a . et les range dans les variables dont les e e adresses sont 1 2 n Pour une variable simple ou un article.4.: : : . a .

la sp ci cation s peut ^re remplac e e e t e par une expression r guli. oblia gatoire. avec le m^me codage que pour printf. faire depuis le type cha^ne lu. Cependant. C'est une lettre.

re simpli e par rapport .

celles qu'acceptent les commandes UNIX qui e e e a d termine l'ensemble des caract.

res admis pour la ch^ne .

lire. L'ensemble des caract.

L' toile indique que la valeur lue suivant la sp ci cation de format n'est pas .res est d ni par e e a e e la notation abc et ses variantes  ^abc . la sp ci cation  0-9 d nit un recherche e e d'entier. a-c . Ainsi.

a ecter .

la sp ci cation * ne "consomme" pas un i . la lecture d'un nombre s'arr^te sur . une e e a a variable et donc. e L est la longeur du champ a lire. Par d faut pas d'entier L.

e e le premier caract.

e Un format peut contenir des s parateurs de sp ci cation. selon e e e la pr sentation des donn es .re qui ne peut pas faire partie d'un nombre. e l est la lettre l si l'entier est long ou si le r el est double. Il y a deux types de s parateurs. et c'est la lettre h si l'entier est short.

lire : e e a sans s parateur. c'est la longueur du champ .

lire qui d termine le nombre de caract.

res .

les champs . lire . e a e e a ::: a avec un s parateur blanc ou TAB.

25 RET 1. &c . &z. ou EOF en n de chier. scanf "4dh *f f.152*. lire sont s par s par un ou plusieurs blancs. &v.dc". e e La fonction scanf d livre le nombre de champs lus et correctement convertis. char c. Alors les variables sont initialis es comme suit : e u=1234 y=56 z=1. avec un s parateur qui n'est pas le blanc ou TAB. e Exemple : Soient les d clarations : e int Supposons que l'on lise : 123456  23. avec l'instruction : u. les donn es doivent ^tre s par es par ce e e e e e s parateur qui est ignor lors de la lecture.82. e a e e TAB ou RET . oat z. short y .82 v=152 c='*' et le prochain caract. &u. v . &y.

re .

e a . lire est le point.

20 4. ENTREES-SORTIES Exemple : * * Le comportement apparent des lectures peut varier d'un syst.5 Lectures et tamponnage du clavier CHAPITRE 4.

me .

Sous UNIX. selon que les entr es e a e sont tamponn es ou pas. et par d faut. les caract. l'autre. les lectures au clavier sont tamponn es : si l'on lit e e e un texte par des getchar .

et si le programme r a che aussit^t le caract.res tap s sont entr s dans un tampon d'UNIX tant qu'on n'a e e e pas tap le retour de ligne.

printf "Somme = d n". on constate que cet e e o e a chage n'a pas lieu avant la frappe du RET. scanf "d d". &n != EOF  s += n . n . e void f int g n Sous Unix.c * Ce programme lit deux entiers et a che leur somme et leur di rence * e include stdio. x et y sont e ectivement initialis s. &b . s .  scanf "d". Ce programme lit des entiers jusq . Fichier somme. terminez par ^D : " . b . e Que ce soit sous UNIX ou sous MS DOS. printf "Tapez deux entiers : " .re lu. printf "Tapez des entiers. a + b.c et on l'ex cute par : e a.h main a. on compile ce programme par gcc somme. on peut programmer l'absence de tamponnage. printf "Somme = d Diff rence = d n".b . &a. s = 0. a . mais le scanf ne se terminera que si l'entier 152 est suivi d'un RET. Dans l'exemple avec scanf.out On termine par un dernier exemple : Exemple : * include stdio.h main s.

la n de chier et ua a che leur somme * void f int while g n .

Chapitre 5 LES INSTRUCTIONS Toutes les instructions peuvent ^tre tiquet es. Certaines ont un terminateur point-virgule. e e R. il n'y a pas de s parateur syst matique d'instruction. d'autres e e e pas .

gle e instruction : identi cateur : f instruction-vide j instruction-expression j instruction.tantque j instruction-r p ter j instruction-si j instruction-cas j ee instruction-sortie j instruction-retour j instruction-pour j instruction-continuer j instruction-aller.

j instruction-compos e g a e L'identi cateur qui peut pr xer une instruction est l' tiquette de cette expression.1 Instruction-expression R. e e 5.

ee e e instruction-expression expression . printf "x vaut de'sormais d nn".gle e Toute expression termin e par un point-virgule devient une instruction : on peut ainsi faire une e a ectation classique. ou appeler une fonction comme une proc dure on perd alors son r sultat e e comme on l'a fait dans les exemples pr c dents avec les fonctions d'entr es-sorties format es. ou bloc e R. * appel de ectation * proc dure * e 5. * instruction d'a x .2 Instruction compos e. : Exemple : x = a * b + 5 .

on d clare des variables locales dans e e ee e les blocs des fonctions.gle e L'instruction-compos e. La e e port e de ces variables est l'instruction compos e. peut comporter des d clarations de variables locales au bloc. et pas dans les autres. En g n ral. instruction-compos e : e f d claration de variable e  21 . ou bloc.

Les prototypes sont vus au paragraphe 9.2.3 Instruction tantque R. LES INSTRUCTIONS g Une instruction compos e est n cessaire lorsqu'on doit mettre deux instructions ou plus quand la e e syntaxe en exige une seule.22 d claration de prototype e + instruction  CHAPITRE 5. 5.

while c=getchar != g putcharc . c = getchar . en simpli ant * EOF 5. * 2 idem. c != EOF putcharc . 1 recopie de l'entr e sur la sortie * e g On peut d placer l'a ectation c = getchar dans l'expression du tantque.4 Instruction r p ter ee R. e instruction-tantque : while expression instruction * Exemple : f int g while f c. e e e e f int c . on doit parenth ser.gle e C'est la boucle avec test de n en t^te : on boucle tant que l'expression est vraie. Comme l'op rateur d'a ectation est moins e prioritaire que l'op rateur d'in galit . c = getchar . ce qui r duit le corps e e de la boucle au putchar et supprime l'initialisation.

gle e C'est la boucle avec test en n de boucle : on r p.

te tant que l'expression est vraie et non pas ee jusqu'.

ce que l'expression devienne vraie. a instruction-r p ter : ee do instruction while expression . Le corps de la boucle est syntaxiquement compos l.

lecture d'une r ponse * e . e a Exemple : f int * do f reponse . aussi d'une seule instruction. printf "Votre choix" . printf "0-4 ? " .

&reponse .5. INSTRUCTION SI 23 4 .5 Instruction si R. reponse 0 || reponse 5. g g while scanf "d".5.

printf "il y avait d lignesnn". nl = 0 . nl . e e Exemple : f int c. g * instruction-si : if expression instruction1 compter le nombre de lignes du chier standard d'entr e * e 5. while c = getchar != EOF if c == 'nn' nl += 1 . qui oblige en fait . un else se raccroche au dernier if non encore appari .gle e else instruction2 Dans le cas de si embo^t s.6 Instruction cas Attention. l'instruction cas du C a une s mantique pas ordinaire.

utiliser e a l'instruction de sortie dans chaque alternative du cas. R.

e e e et sa valeur est recherch e successivement s quentiellement parmi toutes les tiquettes de cas qui e e e sont des expressions valuables .gle e instruction-cas : switch expression + f case expression-constante : default : instruction instruction  g L'expression qui gouverne le cas est d'abord valu e. puis convertie dans le type int ventuellement.

D. la compilation.

le nombre de blancs ou TAB. et le nombre des autres caract. Le choix default e e est pris si aucune tiquette pr c dente convient. le cas ne fait rien. Exemple : f int * compter le nombre de voyelles. S'il n'y a pas de default et qu'aucune tiquette e ee e convient.s qu'une telle tiquette est trouv e. toutes les e a e e e instructions qui suivent y compris celles des autres alternatives sont ex cut es  !.

nbv. nbb. nbb = nbv = nba = 0 . nba .res de l'entr e standard * e e c. c = getchar != EOF c 'a' : 'e' : 'i' : while switch f case case case .

g nba += 1 . case ' ' : case 'nt' : nbb += 1 . n 5. break . LES INSTRUCTIONS case 'o' : case 'u' : nbv += 1 .7 Instruction vide R. nbb. break . default : g printf"Il y avait d voyelles.24 CHAPITRE 5. nbv. nba . d blancs et d autres n".

8 Instruction pour R. instruction-vide .gle e Comme on peut placer des a ectations dans le test d'une boucle. il arrive souvent que le corps d'une boucle soit une instruction vide. : 5.

expression3  instruction while expression2 f instruction . tout est r valu . Sa s mantique est donn e par la construction suivante : e e . a part l'expression1. g Exemple : f int g * initialisation de la boucle * Donc. expression 2 . expression3 . instruction-pour : for  expression1 expression1 .gle e L'instruction pour de C n'est pas une instruction de r p tition avec gestion automatique d'un ee indice : c'est simplement une autre forme syntaxique pour l'instruction tantque.

chaque it ration. .

i = 0 . for On peut grouper plusieurs initialisations dans l'expression1 lorsque ces initialisations sont des expressions. ee e a e * Calcul de ab par multiplications successives * a. i += 1 p = p * a. a . gr^ce a l'op rateur de composition s quentielle d'expressions. p . b. p = 1. i b .

e e .

9. 5. COMPOSITION SEQUENTIELLE D'EXPRESSIONS R.

* Les expressions sont valu es de gauche a droite.gle e 25 5. expression Exemple : for p = 1.9 Composition s quentielle d'expressions e expressions-s quentielles : e + expression . et l'expression r sultante a pour valeur la valeur de e e .

e la derni.

pour traiter un par un les param. p = p * a. i += 1 .re expression. i b . la boucle pour pr c dente peut s' crire : e ee e le corps de la boucle est ici une instruction vide * i = 0. En n. Par exemple.

10 Instruction aller. disponibles dans le tableau argv.tres du programme. Pour la comprendre. 5. il faut avoir assimil le chapitre 7.1 et le paragraphe e 8. on e utilise la boucle qui suit. --argc traiterargv .8. Exemple : while  ++argv.

a R.

gle e Le branchement .

une tiquette l'identi cateur de la r.

e La port e d'une tiquette est le bloc de la fonction qui la d nit. e e e 5.gle instruction de la page 21 se fait par a e e un classique goto : instruction allera : goto tiquette .11 Instruction de sortie R.

Elle permet de r aliser des boucles a sorties multiples.gle e L'instruction de sortie permet de sortir du bloc d'une boucle ou du bloc d'une instruction cas. e .

et e e l'ex cution reprend juste derri. instruction-sortie break . : A l'ex cution de cette instruction. le bloc le plus externe de la boucle ou du cas est abandonn .

re la boucle ou le cas. g on regarde si l'entr e standard contient une sonnerie * e . break . enum frien. while c = getchar != EOF if c == 'n007' fs = sonnerie . e e Exemple : * f int c .g if s == sonnerie printf"Sonnerie dans l'entre'e standardnn" . sonnerieg s = rien .

26 5.12 Instruction continuer R.

: 5.13 Exercice Ecrivez un programme simulant une calculette munie des op rateurs plus. elle termine e e l'it ration en cours et provoque un rebouclage sur le test de la boucle.gle e CHAPITRE 5. fonctionnant sur des entiers. moins. multiplier. diviser e et reste. LES INSTRUCTIONS Cette instruction est peu utilis e et peu utilisable : plac e dans le corps d'une boucle. et ne sachant calculer qu'une formule . e instruction-continuer continue .

l'op rateur. e . 2 op randes et un seul a e op rateur . ou *** si le calcul est impossible. e e e a che le r sultat. c'est donc une boucle sans n qui : e lit le premier op rande. puis le second op rande .

6.6.Chapitre 6 LES TABLEAUX C ne d nit pas un type tableau. mais on d clare des variables tableaux gr^ce au d clarateur de e e a e tableau.1 D claration d'un tableau e Rappelons la syntaxe de d claration d'une variable paragraphe 2. e R.

on place un d clarateur de tableau en partie d clarateur : e e e R. Pour d clarer un tableau.gle e classe type d clarateur e = init .

ou type d ni. le type de la d claration de variable est le type des l ments du tableau type e ee de base ou type structure. et l'expression-constante une exprese ee e sion valuable .gle e d clarateur-de-tableau : e d clarateur e expression-constante Dans ces conditions. ou type num r .

char lettres 2*26 . alors c'est un simple tableau une dimension. et l'identi cateur d signe le tableau. * * tableau de 10 entiers * tableau de 52 caract. Si le d clarateur est un e a ee e identi cateur. la compilation indique le nombre d' l ments du tableau. e Exemple : int t 10 .

res * e Si le d clarateur est lui-m^me un d clarateur de tableau .

on obtient un tableau . une dimension.

qu'on consid. e e e a a deux dimensions.

re comme un tableau de tableaux. e Exemple : oat mat N char lesmots * tableau .

dont chacune est un tableau a e de LONGMAXMOT caract. NBMOTS entr es.

e 27 . carr e * e On verra au paragraphe 7.8 ce qui se passe si on omet la taille du tableau dans le d clarateur.res * e N . NBMOTS * matrice LONGMAXMOT .

Cel. voir plus loin. la valeur d not e par un identi cateur de variable simple est la valeur de cette e e variable. la valeur e d not e par un identi cateur de tableau est l'adresse du premier l ment du tableau ou la valeur d'un e e ee pointeur sur le tableau . Il n'en est pas de m^me pour un identi cateur de tableau : dans une expression.28 6.2 Identi cateur de tableau CHAPITRE 6. LES TABLEAUX Dans une expression.

y N . u 6. explique qu'il n'y a pas en C d'op rateur d'a ectation a e de tableaux. et si le tableau est . Si x et y sont deux tableaux "similaires" d clar s par exemple par int x N . une adresse constante bien s^r.3 Op rateur d'indexation e La num rotation des l ments d'un tableau est toujours la m^me : le premier l ment a le num ro e ee e ee e 0. le second le num ro 1. e e l'expression x = y ne veut rien dire puisque x est consid r syntaxiquement comme une identi cation ee expression qui identi e une variable alors que c'est une adresse.

n l ment. le dernier est num rot n-1. e a ee e e L'op rateur d'acc.

s s lectif est le crochet. e e e R.

gle e expression-indic e : e expression1 expression2 expression2 est ventuellement convertie dans le type entier. alors la valeur de l'expression indic e est la valeur du i. ou une expression de type pointeur vers un type ee T . Si i est sa valeur. et si expression1 est e un identi cateur de tableau d' l ments de type T .

me l ment de type T qui suit l' l ment e e ee ee point par expression1. t i a pour valeur le i+uni. e En clair.

i 5 . e ee Exemple : * f int t 5 . &t i  . 5 . i += 1 scanf "d". t i  . int for i = 0 . i = 0 . * * for g adresse du i. i lire et a cher un tableau de 5 entiers * i.me l ment du tableau t . i += 1 printf "5d".

me l ment * e ee valeur du i.

me l ment * e ee Compte tenu de la remarque sur ce que d note un identi cateur de tableau. l'adresse &t i pass e en ee e e e param. t d note l'adresse du e e premier l ment. Par cons quent. et a donc la m^me valeur que &t 0 .

tre .

On verra plus loin que l'op rateur + ici n'ajoute pas la valeur i . la fonction scanf a donc la valeur t+i . t + i . i += 1 scanf "d". i 5 . La boucle de lecture peut s' crire aussi : e a e for i = 0 .

t . mais la valeur i fois la taille e a d'un l ment de t .

ee a 6. avec les restrictions suivantes si l'on utilise e un vieux compilateur : sa classe d'allocation doit ^tre static ou ce doit ^tre une variable globale e e l'initialisation des variables locales .4 Initialisation d'un tableau On peut initialiser un tableau lors de sa d claration. t .

allocation dans la pile a t introduit dans C lors du processus a ee de normalisation du langage. L'initialisation d'un tableau .

une dimension consiste .

ee . num rer entre a ae e accolades les valeurs des premiers l ments du tableau.

6. LES CHA^NES I R.5.

init  init : expression-constante j f init g Exemple : int t 5 = f3. 3g . * t 0 et t 1 sont initialis s .gle e 29 .

1g. 3gg . mais la biblioth.5 Les cha^nes Toute variable de la forme char c n peut ^tre consid r e comme une cha^ne. 3 * e a int m 3 2 = ff1. Il n'y a pas de e ee repr sentation de cha^ne d nie en C. f2g. f3. * m 1 1 n'est pas initialis * e 6.

que de manipulation de cha^nes impose que e e e tout tableau de caract.

res qui est une cha^ne contienne un caract.

re de code nul. la constante cha^ne "cha^ne" est repr sent e par un tableau de 7 caract. Ainsi. qui est le marqueur e e de n de cha^ne.

qui contient e e e "c h a i n e n0". Comme une cha^ne est un tableau. ni d clarer une cha^ne avec une e initialisation .res. il n'y a pas d'op rateurs sp ci ques dans le e e langage : on ne peut pas en particulier a ecter de cha^nes entre elles. ni plus ni moins.

'i'.'a'. e e L'a ectation ch1 = "cha^ne" est interdite puisque ch est consid r e comme une constante ee adresse .'e'. il faut utiliser la fonction de la biblioth. pour d clarer et initialiser la variable ch .'n0'g .'n'. On verra une autre possibilit au paragraphe 7.8. une constante cha^ne ! Il faudrait en e et logiquement crire : a e charch 7 = f'c'.'h'.

ch sans mettre l'op rateur & puisque ch est une adresse. Lire la cha^ne ch se fera par : scanf "s". la fonction scanf admet la sp ci cation e de format cha^ne s . Par contre.que strcpy : e strcpy ch1. e Les fonctions de la biblioth.ch ou strcpy ch1."cha^ne" .

e e Le chapitre suivant reprend la notion de tableau vu sous l'angle des pointeurs.6 Exercice Ecrivez un programme qui : lit des entiers jusqu'.que sur les cha^nes sont donn es au paragraphe 11. 6.1.

a ordonne au fur et a mesure ces entiers . rencontrer une marque de n de chier . .

a che les entiers en ordre croissant. Pr voyez le cas o.

vous ne lisez pas .

e u a . temps la marque de n de chier.

LES TABLEAUX .30 CHAPITRE 6.

Chapitre 7 7.1 D nition e LES POINTEURS Un pointeur est un objet dont les valeurs servent .

Les a e e valeurs d'un pointeur sont les adresses de ces autres objets. Les pointeurs sont . d signer d'autres objets d'un m^me type.

usages multiples en a C: ils font partie int grante du m canisme d'indexation. qui est en fait une variante de l'adressage e e indirect ils sont n cessaires pour passer des param.

tres r sultats .

7. une fonction e e e a ils permettent de faire de l'allocation dynamique et de construire des structures de listes.2 Op rateurs de prise d'adresse e L'op rateur de prise d'adresse est un op rateur unaire qui s'applique .

R. une identi cation de vae e a riable.

ni .gle e expression d'adresse & identi cation : Cet op rateur ne s'applique pas a des constantes.

des variables de classe register. ni .

des champs e .

int t N .8. a a de bits paragraphe 10. Exemple : int x . * * &x a pour valeur l'adresse de x &t 3 a pour valeur l'adresse du quatri.

e 31 . il n'existe pas de type pointeur.3 D clarateur de pointeur e Comme pour les tableaux. Une variable pointeur est d nie par e un d clarateur de pointeur.me l ment de t e ee &t est interdit t est une constante 7.

32 R.

d clare une variable p qui est un pointeur sur des objets de type entier. p est un d clarateur simple e e r duit . Ici. LES POINTEURS : d clarateur-de-pointeur e * d clarateur e Ainsi la d claration suivante : e int *p .gle e CHAPITRE 7.

Les crochets sont assoe e e e ciatifs . priorit et associativit . pour d clarer un tableau de e a e e e pointeurs ou un pointeur de tableaux. A n de pouvoir interpr ter une d claration telle que : e e int *p N . Ce peut ^tre aussi un d clarateur de tableau. un identi cateur. * pointeur de tableaux ou tableau de pointeurs ? * on utilise les caract ristiques des op rateurs * et .

associative a gauche. La d claration pr c dente a e . droite et sont plus prioritaires que l' toile.

e ee s'interpr.

te donc comme un tableau p .

on a recours aux parenth. N l ments qui sont des pointeurs d'entier. e a ee Pour d clarer un pointeur de tableaux.

e 7.ses : e e int *p N .4 Op rateur d'adressage indirect e R. d clare une variable p qui est un pointeur sur un tableau de N entiers.

et .gle e Le pointeur va servir a faire des indirections.

obtenir des valeurs par indirection. .

int y . int *p = &x . * p est un pointeur d'entier initialis e * l'a ectation x = y peut s' crire : * e *p = y . a : expression-par-indirection * expression L'expression doit ^tre du type pointeur vers un type T . ee Exemple : int x = 4 . et le r sultat de l'expression par indirection e e est la valeur de type T rep r e par la valeur de l'expression.

l'adresse de x * a p x 4 On peut substituer *p .

toute occurrence de x apr.

s l'initialisation de p par l'adresse de x . a e mettre x .

5 Op rateurs sur les pointeurs e Un pointeur pointe sur des objets d'un type donn . Il existe cependant une valeur commune . z ro : *p = 0 a e augmenter x de y : *p += y 7.

d nie dans le chier stdio. . et qui est une valeur de pointeur e ne pointant sur rien.h . e a tous les pointeurs : la valeur NULL .

6. TYPE D'UN POINTEUR UNIVERSEL 33 Les a ectations de pointeurs ayant m^me type d'objets point s sont possibles. si les objets point s e e e n'ont pas m^me type. ou s'ils ont m^me type mais que ce type n'est pas connu .7.

e e e Les op rations arithm tiques suivantes sont d nies sur les pointeurs : e e e addition d'un entier : correspond . on doit utiliser un forceur. l'int rieur d'une e e a e fonction compil e s par ment par exemple.

d clare un pointeur pu pointant sur un type ind termin . 7.6 Type d'un pointeur universel Il est quelquefois n cessaire d'avoir des pointeurs d'un type non d termin . un d placement dans le type point . l'entier est d'abord a e e multipli par la taille d'un l ment du type point avant l'addition e ee e soustraction d'un entier : m^me interpr tation que l'addition e e soustraction de deux pointeurs : fournit le nombre d' l ments situ s entre les deux pointeurs ee e comparaison de deux pointeurs. Un tel pointeur est de e e e type pr d ni void * : ee void * pu .7 Pointeurs et indexation L'indexation est une forme particuli. e e e 7.

re de l'indirection. donc par la taille des l ments du tableau. Ainsi. et expression1 tant de type pointeur ee e ee e un identi cateur de tableau a pour valeur l'adresse du tableau. l'expression t i est quivalente . l'expression indic e : e e expression1 expression2 est calcul e comme tant : e e *expression1 + expression2 le plus tant le plus sur les pointeurs multiplication pr alable de expression2 par la taille des e e l ments point s. Ainsi.

Il en est de m^me pour un tableau . et t i est e ectivement transe a form e par le compilateur en *t+i . l'expression *t+i .

et i est multipli par Q*n . comme gt i est un tableau de Q l ments. avant l'addition. e e ee soit n .. plusieurs dimensions. Puis gt i est lui m^me valu comme *gt+i . e e a Soit . L'expression *gt+i+j a donc pour valeur la valeur de ee l' l ment d'adrese gt+Q*n*i+n*j . T . le signe e e ee + est l'op rateur additif sur les pointeurs. ee . e e e e puisque gt i est un l ment de taille Q*n . gt i j est valu comme *gt i +j . T gt P Q .. et j est multipli par la taille d'un l ment de gt i j . * tableau gt de typedef * type T de taille n * P tableaux de Q l ments de type T * ee Alors.

34 Il ressort de l'expos pr c dent que les notions de pointeurs et de tableaux sont tr.

char *P . LES POINTEURS d clarent tous les deux une variable pointeur sur un caract. les deux d clarateurs suivants : e 7.8 D claration de pointeur et d clarateur de tableau e e char t . En particulier.s proches l'une e ee e de l'autre. CHAPITRE 7.

re. Si l'on fait pointer ces variables sur e e des cha^nes dont le premier l ment entre autre est bien de type caract.

On utilisera un d clarateur ee e ee e de pointeur quand on ne connait pas la taille du tableau : *ch . et la d claration d'un pointeur. *p vaut 'd ' On fera bien la di rence cependant entre la d claration d'un tableau : r servation d'un certain nombre e e e d' l ments. qui n'alloue pas les l ments.. P = "deux" . ch = "longueur ligne a calculer !" . *t vaut 'u ' p 2 vaut 'u '. alors on peut utiliser indi remment la notation index e ou l'adressage indirect pour r f rencer un e e ee l ment de ces cha^nes : ee t 1 vaut 'n '. * simple pointeur sur une cha^ne * i . .re : ee e t = "une" ..

f int i = 0 ... f int i = 0 . * version1 * do f c2 i = c1 i . g * le test != 'n0' est redondant puisq il signi e u en utilisant un tantque. char c2 M . * version2 * while c2 i = c1 i  != 'n0' i += 1 .. On veut recopier c1 dans c2 ... i += 1 . g * Soient deux cha^nes c1 et c2 . . : * .. * le pointeur pointe d sormais sur une cha^ne * e i char On peut d clarer galement : e e char ch * ch est un pointeur qui pointe sur la cha^ne. * i = "longueur." . g while c2 i != 'n0' . Exemple : char c1 N .

mais elle plante ici car c1 et c2 e sont des constantes adresse. Elle convient si c1 et c2 sont des param. 7. * version3 * while c2 i = c1 i  i g f while g * * *c2 = *c1 += 1 . LES OPERATEURS D'INCREMENTATION ET DE DECREMENTATION "di rent de faux"* e 35 f int i = 0 .9. en consid rant c1 et c2 comme des pointeurs : * e fc2 += 1 . c1 += 1 g cette version 4 est s duisante.

tres seulement ! * e Les op rations qui consistent .

ajouter une unit .

une variable tant tr.

s fr quentes. Appliqu s . C a introduit e a ea e e e deux op rateurs pour r aliser cette op ration.

ajouter un s'entend ajouter e e e e a une fois la taille des objets point s. des pointeurs. e R.

9 Les op rateurs d'incr mentation et de d cr mentation e e e e expression-d'incr mentation : e f ++ j .. g identi cation j identi cation f++ j . g Ces op rateurs ont une priorit identique .gle e 7..

l' toile de l'indirection et une associativit de droite a e e a e e .

gauche et sont donc moins prioritaires que les crochets. Leur s mantique est la suivante : e ++x s' value en additionnant un .

e a e x++ d livre la valeur de x . puis additionne un . x . puis d livre la nouvelle valeur de x .

e a Ces op rateurs s'utilisent surtout avec des pointeurs . x . On fera tr.

s attention aux priorit s et aux e e e parenth sages. e Exemple : la boucle de la version 4 de l'exercice pr c dent peut s' crire : ee e while *c2++ = *c1++ . L'associativit tant de droite .

e e pour faire une a ectation indirecte. le ++ porte sur c2 ou c1 : c'est donc c2 ouc1 ee a qui sera augment de un. consid rons maintenant l'expression *x++ dans laquelle x est un pointeur. mais pas avant d'avoir utilis la valeur actuelle de c2 ou c1 . le ++ e porte sur *x puisqu'il y a des parenth. gauche. Ici.

e On peut optimiser l'utilisation des tableaux avec des pointeurs. on a d j. Ainsi. Cette expression d livre donc la valeur *x puis e e *x est augment de un.ses. en utilisant le fait que le nom d'un tableau est l'adresse de son premier l ment.

i N . e Consid rons par exemple la boucle suivante : e 7. vu que tab i et *tab+i taient ee ea e quivalents. i++ tab i = X.10 Tableaux et pointeurs for i = 0 . .

En utilisant un pointeur sur le d but du tableau. i = 0 . LES POINTEURS for i = 0. qui ne sert plus qu'. i++ *ptab++ = X .36 On peut l' crire aussi : e CHAPITRE 7. on a : e for ptab = tab. Mais i. i N . i N . i++ *tab + i = X .

qui devient le while suivant : ptab = tab . ptab fin *ptab++ = X . for ptab = tab . ptab++ *ptab = X .11 Exercices 1. Reprenez l'exemple de l'acc. fin = tab + N . while 7. ptab tab + N . tester la n. peut ^tre supprim : a e e On peut sortir les deux expressions invariantes de la boucle.

s .

D clarez un pointeur e a e pp pour acc der . un entier par indirection du paragraphe 7.4.

Ecrivez un programme qui montre que e a vous pouvez modi er x par double indirection via pp. initialis e a e . Ecrivez un programme qui a che les indices des valeurs nulles du tableau d'entiers tab. l'entier x par une double indirection. 2.

e . et sans d clarer de variable de type entier. sa d claration.

Chapitre 8 LES FONCTIONS On n'aborde pas dans ce chapitre les probl.

e e e On a le choix entre deux syntaxes pour d clarer une fonction : la syntaxe de la norme C. Cependant. On rappelle que la e e e notion de sous-programme est r alis e en C par la notion de fonction. e e R.mes de la compilation s par e. et la e vieille syntaxe.1 D claration de fonction e Comme tout objet. et elles se d clarent toutes au m^me niveau que la fonction main qui sert de programme e e e e et qui peut ^tre absente en cas de compilations s par es. les fonctions ne peuvent e ^tre embo^t es. e e 8. une fonction se d clare avant de s'utiliser. qui pr vaut encore dans la majorit des ouvrages sur C.

gle e d claration-de-fonction : e classe type d clarateur  liste-de-param.

tres  e e d claration-de-param.

tres bloc j e e classe type d clarateur  d claration-des-param.

tres  bloc e e e La premi.

re ligne correspond .

et les param. la vieille d claration : le type peut ^tre omis.

Dans ce cas l.tres e a e e e sont d clar s en deux temps.

. la liste de param.

tres est une simple num ration des e e a e e e identi cateurs des param.

s par s par une virgule. e e e Une d claration de param.tres formels.

tre est analogue .

avec cette e e a e di rence que les param. une d claration de variable sans classe.

tres tableaux a une dimension sont d clar s comme des pointeurs *p ou e e .

e e p . La d claration des param.

tres est une liste de d clarations de param.

tres s par es par des e e e e e e points virgules dans la vieille version. e e Exemple : * * fonction sans param. et s par es par des virgules dans la norme.

tre qui ne d livre rien * e e anciennement : * selon la norme : * proc1 son bloc * f g void proc1 void f son bloc g fonction qui d livre un entier et qui a trois param.

tres : e e deux entiers et un tableau de caract.

t 37 .res * e * anciennement : * * proc2n. m.

char g t  8. char f son bloc g proc2 son bloc t . int f int n. LES FONCTIONS * int n. m .2 Visibilit des objets e Sont visibles dans une fonction : ses param.38 selon la norme : * CHAPITRE 8. int m.

mais dans la m^me entit de compilation e e les variables globales export es par d'autres modules et import es par le module qui d clare e e e la fonction.3. Les r.tres formels e ses variables locales les variables globales locales au module qui d clare la fonction variables d clar es en dehors e e e des fonctions. Ces deux derniers cas sont tudi s dans le chapitre sur la compilation s par e e e e e paragraphe 9.1.

Les variables locales et les param.gles habituelles ont cours : un identi cateur local homonyme d'un identi cateur plus global e cache cet identi cateur global.

tres formels des fonctions sont e allou s automatiquement .

Si arriv e e e l. l'activation de la fonction. et disparaissent quand la fonction se termine. e a Une fonction se termine lorsque son ex cution arrive sur l'accolade fermante de son bloc.

e e Les types des fonctions sont les types de bases. aucune instruction return n'a t ex cut e. et.. La valeur d livr e e e e par une fonction est valu e par une instruction de retour. les types pointeurs. la fonction d livre une valeur ind nie ce peut ^tre a ee e e e e e normal dans le cas d'une fonction de type void qui s'utilise comme une proc dure. depuis la norme. les types structures et bien s^r les types d nis qui sont de ces types-l.

u e a R..

4 Mode de transmission des param.gle e 8.3 Valeur d livr e par une fonction e e instruction-retour : return expression . elle termine l'ex cution et d livre la valeur de l'expression. e e 8. l'instruction de retour termine l'ex cution de la fonction sans d livrer de valeur . Sans expression. e e avec une expression.

tres e Exemple : void lignede int nb. char car * a che nb caract.

res car * e f for  . g Il y a un seul mode de transmission de param. --nb putcharcar . nb 0 .

tre en C. Le param. le mode par valeur.

tre formel e e est donc une variable locale qui est initialis e par une a ectation avec le param.

au moment de l'activation de la fonction.tre e ectif une e e expression. .

.

int n * a che sur une ligne les n valeurs du vecteur v * f int i .4. i n . 8. e 39 Exemple : int max int a. ++i printf"6. on peut d truire sa valeur. g . int b * max de a et de b * f return a b  ? a : b .2f". Lorsqu'un param. for i = 0 . g void AfficherVecteur oat v . MODE DE TRANSMISSION DES PARAMETRES Comme nb est une variable locale. v i printf"nn" .

comme dans l'exemple pr d dent. le param.tre est un tableau.

tre formel reoit e ee e c l'adresse du tableau au moment de l'appel. Comme cette adresse est aussi une valeur de pointeur sur des r els. la notation float * pour le param.

tre v est quivalente .

le compilateur a besoin de connaitre la taille de la des derni. Si le tableau a e e e a plusieurs dimensions. float v .

res dimensions e pour mener .

j N . a Exemple : void AfficherMatrice oat m N N  * ou oat m N * a che la matrice m. g g * j . ++j printf"6. On peut donner a pr sent la grammaire de la d claration des param. for i = 0 .2f". N tant une constante * e f int i. i N . ++i f for j = 0 . m i printf"nn" . bien ses calculs d'adresses voir le paragraphe 7. j .7.

.tres.

e e e R.

gle e d claration-des-param.

::: Le cas des points de suspension indique que le nombre des param. type d clarateur e  .tres : e e type d clarateur e .

La e e fonction doit avoir un moyen de connaitre ce nombre. Exemple :La fonction printf est d clar e dans la biblioth.tres e ectifs peut ^tre variable.

 ::: et l'on sait que le format contient autant de sp ci cations de format que d'expressions plac es e e en param.que par e e e int printfchar * format.

tre e ectif. e L'absence de d clarateur correspond au cas o.

il n'y a aucun param.

tre le type est void. e u e R.

constante .gle e d clarateur : e identi cateur j * d clarateur j e d clarateur j d clarateur e e exp.

40 8.5 Les param.

LES FONCTIONS La transmision par valeur des param.tres r sultat e e CHAPITRE 8.

tres correspond bien a l'id e d'une fonction qui ne r alise pas e .

On peut remarquer tout d'abord que le probl. Mais on sait bien qu'on a souvent besoin d' crire un sous-programme qui transforme e la valeur d'un objet. e e d'e et de bord.

me est r solu en ce qui concerne les tableaux : e e comme le param.

toute manipulation sur le e e param.tre formel est initialis avec l'adresse du tableau e ectif.

tre formel quivaut a une manipulation sur le param.

tre e ectif. e e .

g Par contre. for i = 0 . &v i  . i n . int n * lit les n valeurs de v * f int i . ++i scanf"f". puisque c'est sa valeur avant l'appel qui est copi e dans le param. e Exemple : void LireVecteur oat v . une variable simple qu'on veut modi er par un sous-programme ne peut ^tre pass e e e par valeur.

tre e ectif : on doit e e donc transmettre son adresse. et indiquer dans la d claration de param.

tres que le param.

Exemple : void permuter int *x. &b . aux = *x .tre est un e e e pointeur. pour permuter a et b * 8. int *y f int aux .6 Param. g * * permute x et y par indirection * appel : permuter&a. *x = *y . *y = aux .

est augment e . dans une version traditionnelle. la valeur du pointeur sur les deux cha^nes.tres tableaux et pointeurs e Reprenons sous la forme de sous-programme la copie d'une cha^ne dans une autre . while ch1 i = ch2 i g char ch2   != 'n0' ++i . transmise en entr e. La version avec pointeur est plus concise : void CopieChaine char ch1 . char f while *ch1++ = *ch2++ . nous crirons : e void CopieChaine char ch1 f int i = 0 . g ch2  Dans cette version. .

e e a chaque tour de boucle pour pointer successivement sur toutes les cases de ch2. e et transformons-le sans pr caution en une fonction d livrant un vecteur. Reprenons le sous-programme LireVecteur. L'utilisation des pointeurs doit se faire n anmoins avec une grande vigilance. e e .

.

7. 8. erreurs * * Lit et d livre un vecteur a n entr es * e . LES FONCTIONS EN PARAMETRE 41 oat * LireVecteur int n * Attention.

e f oat v . la programmation est classique : d claration d'un tableau local de taille inconnue v. e . et l'ex cution de la fonction risque m^me de e e bien se passer. si l'ex cution s'est e ectivement bien e e pass e c'est a dire. l'instruction retour d livre la valeur du pointeur v. --n scanf"f". g Apparemment. Le compilateur ne dira rien. qui. n 0 . return v . &v n  . e puis lecture de ce tableau. Il y a deux grosses erreurs : e la d claration oat v ne d clare pas un tableau. et d livrance du tableau local. si on a pu sans dommage empiler n r els non pr vus sur la pile d'ex cution. mais seulement un pointeur sur un ventuel e e e tableau de ottants. for  .

e e e est une variable locale qui disparait .

on devrait d clarer le tableau v avec la e classe d'allocation static. a Si l'on voulait e ectivement retourner la valeur du pointeur. la n de l'activation de la fonction. On ne peut pas passer une fonction en param.

tre. Par contre. Prenons e un exemple tir de la biblioth. on peut transmettre un pointeur e sur une fonction de m^me qu'on peut fabriquer un tableau de pointeurs sur des fonctions.

que C. e e La biblioth.

d clar e par : e e 8.h contient une fonction de tri de tableau par le tri rapide de e Hoare.que standard stdlib.7 Les fonctions en param.

dont les l ments font ee size caract.tre e void qsort void *arr. int size. de longueur n. int *comp fn void*. qui trie le tableau arr void * : tableau de n'importe quoi. int n. void* .

et dont la relation d'ordre est d nie par le pointeur comp fn sur une fonction .res.

deux e e a param.

tres pointeurs quelconques et d livrant un entier. La fonction de comparaison admet comme e e param.

on d clarera e la fonction : int comp int void *e1. et d livre un entier n gatif si e1 e2.tres deux l ments e1 et e2 du tableau. et positif si e1 e2. Pour utiliser qsort pour comparer un tableau t de n entiers. void *e2 * pour ^tre conforme a la e . nul si e1 = e ee e e e2.

. sizeof int. comp int .second . * forceur obligatoire ! * int second = * int *e2 . g et on appelera qsort ainsi : qsort t. n. return premier . d claration de comp fn * e f int premier = * int *e1 .

LES FONCTIONS On remarquera deux choses : e on n'a pas mis de & devant le param.42 CHAPITRE 8.

on a d clar le param. dans qsort.tre e ectif comp int : le compilateur trouve lui m^me qu'il e faut transmettre un pointeur sur comp int .

8.8 Les arguments de main Exemple : * * Lorsque la fonction main est appel e. il faut d clarer deux ou e e e trois param. l'interpr teur du langage de commande lui transmet les e e arguments de la ligne de commande.tre *comp fn par un prototype de fonction qu'on verra dans e e e le chapitre sur la structuration des programmes. Pour les r cup rer dans le programme.

est un tableau de pointeurs sur des cha^nes. argv 3  . le troisi^me. fclosef . ++i * remplissage des N lignes * fprintff. "s n". argv.  argc == 3 N = atoiargv 2  . i N . est un tableau de pointeurs sur des cha^nes de la forme "nom = valeur". void int f int int if f for g g else char n printf"Donnez 3 param. * atoi transforme une chaine en entier * f = fopenargv 1 . est un entier qui d nombre les arguments transmis. tel que argv 0 pointe sur l'ar gument 0 le nom de l'ex cutable appel . "w" . Engendre un chier de nom parametre 1 qui contient parametre 2 lignes de parametre 3 Enregistr dans le chier " chierde" e include stdio. * chier f * i. N.h main  argc. argv argc . e tableau qui donne les noms et valeurs des variables de l'environnement.1 pointe sur le dernier argument et e e argv argc vaut NULL. env. e le second. * ouverture en criture de f * e i = 0 . *argv  FILE *f .tres selon les besoins : e le premier. argc.

tres SVP n" .4.9 Exercices 1. Voir paragraphe 11. Anticipant l g. n* 8. e n On pourra appeler ce programme par fichierde etoile 4 pour fabriquer le chier toile de 4 lignes contenant chacune une toile.1 pour e e l'ouverture du chier f.

et secondes pour les secondes. Le temps y est mat rialis par trois variables globales : heures pour e e l'heure.rement sur le chapitre suivant. on vous demande d' crire un module de gestion ee e rudimentaire du temps. Le module comprend les 3 op rateurs suivants : e . minutes pour les minutes.

EXERCICES secondes .9.. heures ..... minutes . e la proc dure Etablir heure qui a 3 param. 43 la proc dure Afficher heure qui a che correctement Il est .8..

On veut crypter un texte selon le principe du d calage des lettres : tout caract. m. 2. e e la proc dure Tic qui fait avancer l'heure d'une seconde. e Vous crirez un programme pour tester ce module. On y incluera ici le programme e e principal. s pour initialiser l'heure .tres h. Note : le module consiste en un chier e qui d clare l'heure en variable globale. puis les 3 op rateurs.

re qui n'est pas e e une lettre est inchang . toute lettre est d cal e dnas l'alphabet d'une distance gale a la cl de e e e e .

e cryptage. Vous crirez : e une proc dure qui admet en premier param.

tre la cl du cryptage et qui crypte le caract.

re e e e e transmis en deuxi.

me param.

tre. le deuxi.

me param.

e e e e e e une proc dure qui admet en premier param.tre sert en entr e comme en r sultat .

tre la cl du cryptage et qui crypte le texte e e e transmis en deuxi.

me param.

tre dans un tableau . et a che le r sultat du cryptage. e e un programme qui d clare un texte global. e e . le crypte.

44 CHAPITRE 8. LES FONCTIONS .

e R. d'un module comportant des sous-programmes et la fonction main.Chapitre 9 STRUCTURATION DES PROGRAMMES La composition de d clarations de type. ou utiliser plusieurs modules compil s s par ment. de variables et de fonctions permet de fabriquer des e modules. e e e 9.1 Composition d'un module Un module est une entit de compilation. Un programme peut se composer de la seule fonction main.

gle e module :  directive-au-pr -compilateur e d claration-de-type e  d claration-de-variable e d claration-de-prototype e  d claration-de-fonction e   Le langage n'impose aucun ordre dans les d clarations. contrairement .

la r.

gle pr c dente. le compilateur risque de prendre des initiatives du ee . mais si e a e ee l'on fait r f rence a un objet d clar plus loin.

e e Les directives au pr -compilateur servent . e e genre type par d faut d sastreuses.

inclure des chiers de biblioth.

que ou non. .

on cr e en g n ral un chier comportant des d clarations de types. Les d clarations de type ont une port e qui est le module . elles ne sont pas exportables. Apr. Pour e e exporter des types.1. e e 9. d nir e a e a e des constantes ou des macro-instructions voir paragraphe 12.1 Variables locales du module Une variable locale au module est de la classe d'allocation static. e e Les d clarations de variables et de fonctions peuvent d nir des objets locaux ou globaux. et on l'inclut e ee e en t^te de chaque module qui en a besoin par une directive au pr -compilateur.

s la d claration : e e static int t 100 . le tableau t est une variable globale vis-.

1.2 Variables globales Toute variable d clar e en dehors d'une fonction et qui n'a pas d'attribut de classe est une variable e e globale : elle est automatiquement export e par le compilateur. e 45 . mais c'est une a e variable locale au module en ce sens qu'elle est inaccessible depuis les autres modules. 9.-vis des fonctions d nies dans le module.

Cel.1.46 CHAPITRE 9. STRUCTURATION DES PROGRAMMES 9. il faut l'importer explicitement.3 Variables externes Pour utiliser dans un module A une variable globale d'un module B.

consiste .

d clarer localement .

A la variable globale de B et .

1. e 9.1.4 Fonctions locales au module 9. Toutes les fonctions d clar es dans un module sans attribut de classe sont a priori des fonctions e e globales que tout module peut utiliser a condition de l'importer. elles ne sont pas accessibles depuis les autres modules. les fonctions locales ont l'attribut static . mais elle sera accessible depuis A. .5 Fonctions globales Comme pour les variables locales du module. lui donner la classe extern : la a a e a a variable ne sera pas localis e dans le module A.

Pour utiliser dans un module A une fonction globale d nie dans un module B. Cependant. Le compilateur doit en e et connaitre non seulement le type de la fonction. il faut l'importer e explicitement. cette importation ne se fait pas de la m^me faon que pour les variables e c externes. mais aussi le nombre et le type de ses param.

L'importation consiste alors a donner une d claration du e .tres.

1. e prototype de la fonction. sans lui mettre l'attribut de classe extern mais on peut le mettre quand m^me.2 Prototype de fonction Un prototype de fonction est analogue . e 9.6 Fonctions externes 9.

une d claration de fonction dans laquelle le bloc est a e remplac par un point virgule . le nom des param. de plus.

e e e R.tres formels peut ^tre omis.

4 peuvent s' crire : * e ch . Les prototypes des fonctions lignede et max du paragraphe 8. e d clarateur-abstrait : e identi cateur j j * d clarateur-abstrait j d clarateur-abstrait j e e d clarateur-abstrait e expression-constante j d claration-de-prototype e Exemple : * void lignede int n. type d clarateur-abstrait  . char int max int a.gle e d claration-de-prototype : e extern type d clarateur type d clarateur-abstrait  e e . int b . Le nom du param.

et il peut ^tre omis.tre formel n'est pas utilis par le compilateur. e e e contrairement .

ce qui se passe en Pascal : a void lignede int. int max int. char . int . .

ORDRE DES DECLARATIONS DANS UN MODULE 47 version qui semble pr f rable.3. 9. ee Il est a noter que les anciens compilateurs hors norme n'acceptent aucune d claration de param.

tre .

int max . puisque le type par d faut est le type int mais ce genre d' criture est . max . Il aurait fallu crire : e void lignede . e e dans les prototypes. ou m^me simplement : e lignede .

puis les e e autres fonctions. ne fonctionnera correctement que si toutes les fonctions sont e e de type int ou void : lorsque le compilateur compile un appel de fonction. organis sans pr caution. proscrire . l'ordre est quelconque : on peut commencer par d clarer la fonction main. En fait. du moment que toute variable r f renc e a t pr c d e de sa d claration. e e a ::: Th oriquement. ee e ee e e e e un tel module. deux cas se produisent : ou il connait d j.

e ou il ne connait pas encore la fonction. le code de r cup ration de la valeur de la fonction sera correct. parce qu'elle est d nie plus loin. le compilateur engendrera une r cup ration d'un entier. soit la d claration du prototype de la fonction. et il prendra la valeur par d faut pour un type de fonction. e Dans le premier cas. car il suppose que la fonction viendra e e plus tard. Concr. la fonction. ou parce qu'elle n'est e pas d nie du tout fonction externe. parce que le module contient plus haut soit la d claration de la ea e fonction. Dans le e e second.

3 Ordre des d clarations dans un module e 9. classe par d faut e r manentes classe static.tement. dans n'importe quel ordre.1 Composition d'une fonction Le bloc d'une fonction peut contenir des d clarations de variables et des d clarations de prototype. l'ordre devrait e e ^tre le suivant : e le commentaire sur le module les directives au pr -compilateur e les d clarations des variables globales et les d clarations des variables externes import es e e e les d clarations des prototypes de toutes les fonctions utilis es dans le module import es ou e e e non les d clarations des fonctions. e 9. e e Les variables d clar es dans une fonction peuvent ^tre : e e e locales classe auto.3. c'est a dire qu'elles conservent leur valeur d'un appel .

l'autre ce e .

a sont des variables allou es avec les variables locales du module e externes classe extern. Si une fonction est seule dans son module a importer telle variable globale et telle fonction externe. .

il est conseill d'y placer les d clarations d'externes et de prototype correspondant plut^t que de les e e o placer en t^te du module voir l'exemple du paragraphe 10. e .4.

et donc qu'il peut optimiser en cons quence.2 R sum sur l'organisation des donn es e e e Le tableau de la gure 9.1 synth tise les dur es de vie et les visibilit s des variables en fonction e e e de leur localisation. const Cet attribut indique au compilateur que la valeur initiale obligatoirement fournie lors de la d claration ne variera pas.3. e e volatile Cet attribut indique au compilateur que la variable "consomme" sa valeur .48 CHAPITRE 9.3 Attribut des variables La classe d'une variable locale. 9. Sorte de variable Localisation Classe Dur e de vie Visibilit e e variable globale module programme module variable de module module static programme module variable locale fonction auto ou rien bloc bloc variable r manente fonction e static programme bloc variable import e e module extern programme module variable import e e fonction extern programme bloc Fig. STRUCTURATION DES PROGRAMMES 9.3.1: Les sortes de variables 9. de leur classe et de leur sorte. peut e prendre une valeur d'attribut. L'op rateur de mise d'adresse & est e e interdit sur une variable qui a cet attribut. omise la plupart du temps puisque c'est auto par d faut. Il y a trois attributs possibles : register cet attribut est une sorte de pragma qui indique au compilateur qu'on souhaiterait que la variable en question soit allou e dans un registre.

chaque a eca tation. et lui interdit de faire les optimisations classiques. L'exemple classique le seul ? est celui d'un pointeur de caract.

re qui d signe un port d'entr e-sortie : si l'on envoie succese e e sivement deux commandes sur le port. il serait regrettable que le compilateur supprime la premi.

l'exemple qui suit e e e fonctionne sur une machine type 68000. o.re a ectation sous pr texte qu'elle sera annihil e par la seconde .

qui a des instructions particuli. les entr es-sorties se font par a ectation des ports u e il ne fonctionnerait pas sur un 80x86.

. * autre commande * L'attribut register peut galement ^tre donn .. e e volatile char *port de commande . *port de commande = 0x1e ..res d'entr es-sorties. * reset * *port de commande = 0x20 .

un param.

9.4 Exercice Ecrivez un module qui g.tre formel d clar selon l'ancienne m e e ea e e e e thode.

re une pile d' l ments de type tableau chaine de caract.

e . le pr dicat pilevide .res d ni dans e ee e e le module. Il exporte : le type chaine .

9. Par ailleurs. e et qui la r a che . vous crirez un programme ne faisant pas partie du module. l'accesseur sommet qui d livre la cha^ne en sommet. e le modi cateur depilerch qui extrait ch. qui lit une phrase au clavier. EXERCICE 49 le constructeur empilerch qui empile ch .4.

e a . l'envers.

STRUCTURATION DES PROGRAMMES .50 CHAPITRE 9.

e e e e 10.Chapitre 10 LES ARTICLES Les articles en C s'appelent des structures.1 Le type structure R. Un objet de type structure est un objet compos de e plusieurs champs qui peuvent ^tre de type di rent et qui sont d not s par un identi cateur.

il s'agit d'un type anonyme. eee e identi cateur : type structure struct f d claration-de-champ . s'il est omis. Une d claration de e champ est analogue .gle e Chaque occurrence d'un type structure est pr c d e du mot-cl struct. e + g L'identi cateur est le nom du type .

dans une premi. une d claration de variable sans classe. On a donc.

re approche : a e e R.

La premi. ven.gle e d claration-de-champ : e type d clarateur . g UNE DATE . dimg JOUR . struct date d . typedef struct f JOUR j . d clarateur e e  Exemple : struct date * d claration du type struct date * e f short j. mer. g. int a . jeu. typedef enum flun. sam. mar. m .

re d claration d nit le type struct date compos de trois entiers de tailles di rentes. la e e e e e derni.

e ee 10. on peut a ecter deux articles de m^me type. et donc passer un article en e param.re d nit le type UNE DATE comme tant le type anonyme structure compos e d'un champ de e e e e type num r et d'un champ de type struct date.2 Op rateurs sur les types structures e Depuis la norme C.

e 51 .tre.

e e e R. Le e e e dernier op rateur est pr sent plus loin.52 CHAPITRE 10. LES ARTICLES L'autre op rateur permet la s lection d'un composant. par la notation point e habituelle.

aujourdhui. aujourdhui.gle e expression-champ-d'article : expression.m = 5 .3 Articles en param.d. cf paragraphe pr c dent * ee 10.j = 9 .d. aujourdhui.j = mar . demain .a = 1989 .d. aujourdhui.identi cateur-de-champ * Exemple : UNE DATE aujourdhui.

l'op rateur e e e d'indirection et l'op rateur de prise d'adresse ont m^me priorit .tre e void LireDate struct date f scanf"hd *c hd *c g * L'op rateur point est plus prioritaire que l'op rateur de prise d'adresse : par contre. et sont associatifs de droite .

gauche. e e e a D'o.

une fonction peut ^tre de type article. 10.4 Fonctions de type article Exemple : f Depuis la norme C. &*d. L'exemple suivant est une fonction qui e a en param. &*d.j.d .a . Appel possible : * LireDate&aujourdhui. &*d. la proc dure de lecture suivante : u e *d * lit jj-mm-aa * d".m.

j != nbjoursdumoisaujourdhui.j + 1 .tre une date et qui calcule la date du lendemain. demain.d.j = aujourdhui.m = 1 . demain. demain.m = aujourdhui.a = aujourdhui.d. demain.d.d.a + 1 . 12 demain.m .d f * simplement passer au jour suivant * g else if aujourdhui.d.d.m == f * changement d'ann e * e demain.j = 1 . nbjoursdumois date d .m * e JOUR nomdusuivantJOUR j . * d livre le nombre de jours du mois d. e UNE DATE lendemainUNE DATE aujourdhui UNE DATE demain . * d livre le nom du suivant e int struct de j * if aujourdhui.d.a = aujourdhui.d.d.d.d.a .d. .

return demain . 30. else return nbjours d.j * e f int anneebissextile int annee . demain. f return g int int nbjoursdumois struct date d * d livre le nombre de jours du mois d.m + 1 .d. INITIALISATION DES ARTICLES 53 g g else * changement de mois * f demain. 31.10. * vrai ou faux * short nbjours 12 = f31. 30.d. if d. * tableau index .m . 31. g demain.j . 28.1 .m = aujourdhui.m == 2 && anneebissextiled. 31. 31. 31g .d. 31.j = 1 . JOUR nomdusuivantJOUR j JOUR j + 1  7 .5.a .d. demain.a return 29 .d.a = aujourdhui. 30. 30.j = nomdusuivantaujourdhui.

6 Pointeurs sur les articles Avant la norme C. les a ectations de structures taient interdites : on tait amen . Par exemple : UNE DATE d = flun. initialise le nom du jour. comme pour les tableaux. f3. le num ro du jour et le mois de la variable d e 10. g 10.5 Initialisation des articles On peut. 5gg . partir de z ro * ea e g int anneebissextile int annee f return annee  4 == 0 && annee  100 != 0 || annee  400 == 0 . initialiser les articles lors de leur d claration : les valeurs e fournies iront dans les premiers champs.

d clarer de e e ea e nombreux pointeurs sur des structures param.

valeurs des fonctions.tres. La notation d'acc.

s .

un e e a champ C d'un article rep r par le pointeur p est lourde. rappelons l.

: c'est *p.c. Cette notation ee a est simpli e gr^ce .

l'op rateur . beaucoup plus lisible : *p.c est quivalent .

e a a e e a R.c. p.

identi cateur-de-champ j expression identi cateur-de-champ .gle e expression-champ-d'article : expression.

LES ARTICLES Dans le premier cas. l'expression doit d signer un article .54 CHAPITRE 10. dans le deuxi.

j. &d. &d.7 Taille d'un article : op rateur sizeof e R. &d. l'expression doit e e d signer un pointeur sur un article. e La proc dure Liredate des paragraphes pr c dents peut s' crire alors : e ee e void Liredate struct date f scanf"hd *c hd *c g *d d".m.a 10.me cas.

mais e e e pas un param.gle e L'op rateur sizeof d livre la taille en octet occup e par une variable locale ou globale.

tre formel ni une variable externe. e Attention. par les objets d'un type. bien que sa syntaxe semble l'assimiler . ou par une expression.

et qui de a e plus est valu a la compilation. e e. c'est bien un op rateur. une fonction.

expression-de-taille : sizeof expression j sizeof identi cateur-de-type On ne peut pas faire l'hypoth.

se que sizeofarticle soit la somme des taille de chaque champ de e article. a cause des ventuels probl.

mes d'alignement. .

Les articles vus dans les paragraphes pr c dents sont allou s en fonction du type des champs : un ee e bool en d clar en int occupera un mot. e e Exemple : e sizeof UNE DATE est une constante qui est le nombre d'octets occup s par un objet de type UNE DATE. Il est possible de demander une allocation au bit pr. sizeof nbjours sizeof short est une constante qui vaut 12.

La syntaxe compl. avec e e e e la notation dite de champ de bits.s.

te de la d claration de champ permet d'indiquer e e par une expression constante la taille en bit du champ. R.

e aussi utilise-t-on pratiquement toujours le type unsigned int.gle e 10.8 Les articles tass s e d claration-de-champ : e  type d clarateur . d clarateur e e j type identi cateur : expression . le type signed int peut avoir des e ets bizarres. le champ de bit sert . Sans identi cateur. type identi cateur : expression  Le type d'un champ de bit ne peut ^tre qu'entier .

Une constante 0 indique que l'on veut cadrer le e champ suivant sur une fronti. les champs sont allou s en s quence. combler une zone de bits non utilis e : en e et. sans a e e e modi cation de l'ordre donn dans la structure.

le mot sur une machine e .re adressable l'octet sur une machine a octets.

a .

:1 .  ::: Exemple : struct entree f unsigned int type unsigned int vide unsigned int trou :4 . * * * entier sur 4 bits * un bool en * e un bool en * e . :1 . mots.

9.10. short int index . unsigned int sens :5 . on saute jusq . LES UNIONS 55 * * * * g unsigned int :0 . unsigned int :3 .

la fronti.

re * ua e champ non tass * e trou inutilis de 3 bits * e entier sur 5 bits * Une telle structure pourrait ^tre implant e comme ceci. sur trois octets : e e sens index t v type ::: mais elle pourrait tout aussi bien ^tre implant e dans l'autre sens le champ type d'abord . void * p . g mot . e 10. Une union permet de faire des quivalences de type. mais l'op rateur de prise d'adresse e e e n'est pas autoris : on n'a pas non plus de pointeurs sur les champs de bits.9 Les unions union unmot f int entier . c'est . Les e e op rations sur les champs de bits sont les op rations sur les entiers. char car 4 .

en remplaant struct par union. dire qu'elle permet de consid rer une e a e m^me zone m moire selon di rentes interpr tations. Si l'on fait r f rence e ee a . La syntaxe d'une union est la m^me que celle e e e e e d'un article. La variable mot suivante : c est allou e sur un seul mot machine on suppose une machine 32 bits ici.

entier. tandis que mot.car 1 ee e sera interpr t comme tant un caract. on obtient une valeur interpr t e comme tant un entier. mot.

p comme tant un pointeur de n'importe quoi. ee e e e Contrairement .re et mot.

rien n'indique quelle est l'interpr tation valide . Pascal.

un instant donn . "la" pile du module n'existe plus. la zone allou e permet d'implanter le plus grand. * = "abcd" serait refus * e Reprenez le module du chapitre pr c dent : il d clare une pile et ses op rateurs . e e e En cas d'initialisation lors de la d claration la valeur doit ^tre du type du premier champ : e e union unmot m = 25 . a e a e Si les di rents champs n'ont pas la m^me taille. transformez-le ee e e pour qu'il d clare un type abstrait pile. seul e son mod. Dans ces conditions.

e e Le type PILE est bien entendu un article. pour initialiser la pile . Comme on ne peut pas initialiser les champs d'un type article.le existe : c'est l'utilisateur qui d clare la variable pile. init. vous ajouterez un op rateur au type PILE.

vide. Tous e a les op rateurs du module ont un nouveau et premier param.

tre : "la" pile sur laquelle ils op.

10 Exercice . e e e Reprenez galement le programme.rent. e 10.

LES ARTICLES .56 CHAPITRE 10.

Chapitre 11 LES FONCTIONS DES .

BIBLIOTHEQUES STANDARD Plusieurs domaines de la programmation ne sont pas couverts par le langage. mais par ses biblioth.

qui sont standardis es par la norme : les manipulations de cha^nes.ques. l'allocation e e dynamique. Ce chapitre pr sente quelques unes des fonctions les plus courantes de ces biblioth. de chiers.

ques. il faut obligatoirement d clarer leur prototype dans le module qui les appelle : e pour cel. e e Pour pouvoir les utiliser.

1 Les manipulations de cha^nes Rappelons qu'une cha^ne est un tableau de caract. 11.. il su t d'inclure le chier de d clarations correspondant qui se trouve dans le r pertoire a e e usr include dans le cas Unix.

res contenant une valeur de cha^ne compos e e e de caract.

res quelconques et termin e par le caract.

Le chier des d clarations de e e e e prototype s'inclut par : include string. pointeur sur la cha^ne qui est la concae t nation des cha^nes dest d'abord et source ensuite. D livre dest. char *source . e char *strchr char *ch. char c . char *strcat char *dest.h . D livre un pointeur sur la premi.re de code nul.

D livre la longueur e ective de ch. e int strlen char *ch . ou NULL. char *source . char *ch2 . et d livre : e ch1 ch2 ch1 = ch2 ch1 ch2 ! .re apparition de c dans la e e cha^ne ch. Copie source dans dest et d livre dest.1 ! 0 ! +1 char *strcpy char *dest. caract. int strcmp char *ch1. Compare les cha^nes ch1 et ch2.

e e char *strstr char *ch. D livre le pointeur sur la premi.re NULL exclu. char *ssch .

*strncat  ssch char char premiers caract.re sous-cha^ne e e contenue dans ch. ou NULL.

*source. mais ne copie que les n premiers s'il y en a n caract. mais limit aux n e unsigned n . Comme strcpy. Comme strcat. char *source.res de dest. e *strncpy  char *dest. unsigned n .

e 57 char *dest.res de source. char .

58 .

LES FONCTIONS DES BIBLIOTHEQUES STANDARD strncmp  n int char char que caract. CHAPITRE 11.

char *ch2.res.h sur le HP. car elles sont d clar es dans e e e e e e memory. mais ne compare au plus char char *ch . Sur les SUN. C'est une g n ralisation des fonctions sur les cha^nes. Elles sont ee d clar es galement dans le chier string. on les obtient a partir de la biblioth. Comme strcmp. e Ces fonctions travaillent sur des zones de type quelconque pointeurs de type void * et s'utilisent conjointement avec des forceurs. e D livre ch convertie en majuscules . D livre ch convertie en minuscules. e *strlwr  *strupr char *ch1. unsigned n . *ch .h en th orie tout du moins.

que System V en faisant .

unsigned n .a. e void *memchr void *z. Recherche le premier c parmi les n premiers caract. unsigned char c. e l' dition de liens avec l'option -L usr 5lib qui ira chercher le chier usr 5lib libc.

unsigned n .res de la zone z. Compare les n premiers caract. et d livre un pointeur sur c. void *z2. e e int memcmp void *z1.

et d livre 0 si les zones sont gales.res des zones z1 e et z2. une valeur positive si z1 z2. Copie n caract. une valeur n gative e e e si z1 z2 void *memcpy void *z1. void *z2. unsigned n .

void *z2. unsigned n .res de z2 dans z1 et d livre e e z1. mais fonctionne m^me si e les zones se chevauchent. unsigned char c. void *memset void *z. void *memmove void *z1. Comme memcpy. unsigned n . D livre z et positionne ses n pree miers caract.

res .

11.2 Les manipulations de zones de m moire e Exemple :Pour copier deux tableaux a et b d' l ments d'un type T quelconque.3 Les fonctions de test ou de transformation de caract. la valeur c. sizeof a . on fera : ee memcpy void *a. void *b. e a 11.

re e Ces fonctions sont souvent impl ment es par des macros du pr -compilateur. Elles rendent un e e e entier .

consid rer comme un bool en. a e e int isalpnum int c . c est il un caract. sauf pour les deux fonctions de transformation.

re aphanum rique? e e int isalpha int c . c est il un caract.

c est il un caract.re alphab tique ? e e int iscntrl int c .

re de contr^le ? e o int isdigit int c . c est il un caract.

re chi re ? e int islover int c . c est il un caract.

c est il un caract.re lettre minuscule? e int isupper int c .

c est il un caract.re lettre majuscule? e int isspace int c .

c est il un caract. RET.re blanc. TAB. ? e int isxdigit int c .

sinon la lettre c en majuscule. e int toupper int c .re hexad cimal? e e int tolower int c . D livre c si ce n'est pas une lettre. e ::: . sinon la lettre c en minuscule. D livre c si ce n'est pas une lettre.

idem. char *ch. et d e livre un pointeur sur ch char *ltoa long el. int sprintf char *tampon. conversion cha^ne ch en entier long atol char *ch .4. double atof char *ch . char *format. char *ch.  . 11. pour convertir l'entier long el. conversion cha^ne ch en ottant double int atoi char *ch . int base .h e pas sur SUN ni HP. conversion cha^ne ch en entier long char *itoa int e. int base . Analogue . LES ENTREES SORTIES ET LES FICHIERS 59 Les conversions de cha^nes en nombres et vice versa sont parfois d crites dans le chier stdlib. convertit e dans la cha^ne ch suivant la base.

mais range le r sultat a e dans le tampon et non a l' cran. printf. .

char *format. e int sscanf char *tampon. Analogue .  .

::: ::: 11.3. scanf.1 Les conversions Pour la biblioth. mais extrait les donn es du a e tampon et non du clavier.

un chier est toujours un ot de caract.que C.

et muni d'un acc.res inorganis .

s e e e e s quentiel et d'un acc.

s direct au niveau du caract.

re.h. On y trouve les d nitions des constantes NULL et EOF d j. Les chiers s'utilisent avec l'insertion du e e e chier stdio.

La plupart des op rateurs sur les chiers ont un param. ainsi que la e ea e d nition d'un type FILE une structure. rencontr es.

11. sortie et erreur standard. stderr entr e.tre e e e de type pointeur sur FILE.4 Les entr es sorties et les chiers e Trois chiers sont pr d nis : stdin. stdout. pour "d clarer" un chier f. on d clare en fait : e e FILE *f . Aussi. ee e L'op ration d'ouverture r alise .

Ouvre le chier externe dont le nom est le premier param. et l'ouverture proe e a prement dite. la fois l'assignation avec un chier externe. FILE *fopen char *nom. char *mode .

avec le mode donn en second param.tre une cha^ne.

e e e e ou NULL si le chier externe n'est pas trouv .4. Le mode est aussi une cha^ne : e r w a r+ w+ a+ 11. et d livre un pointeur de chier.tre.1 Ouverture et Fermeture ouverture en lecture ouverture en criture e ace le chier s'il existe d j.

 e ea ouverture en allongement  criture en n de chier e ouverture en lecture pour mise .

jour a analogue .

a ouverture en lecture et en allongement. A ces six modes. on peut ajouter un "b" nal si le syst. mais permet de lire. w.

me a la notion de chier binaire. cel. Pour e MS DOS.

emp^che qu'un nn soit copi sous la forme des deux caract.

alpha"". *fopen *. "r" == NULL printf"Pas l'acc. f = fopen". a e e e f Exemple : if FILE *f.res NL+RET.. * .

e char char n ..s sur . alpha n" .

60 .

. Ferme le chier ancien et ouvre le chier externe nouveau en l'assignant . LES FONCTIONS DES BIBLIOTHEQUES STANDARD else . g FILE *freopen  char *nouveau. FILE *ancien . CHAPITRE 11. char *mode..

et d livre ancien si tout va bien. ou NULL a e sinon. ancien. Cette fonction sert surtout .

. r assigner dynamiquement les chiers standard : a e Exemple : . "r"... if freopen". stdin == NULL printf"Pas d'acc. alpha".

alphann" . EOF dans le cas contraire.2 Fin de chiers et erreurs int feof FILE *f Si la n de chier est atteinte pour f. e e e void clearerr FILE *f E ace les indicateurs de n de chier et d'erreur du chier f 11.s sur .3 Acc. et faux sinon.. d livre vrai valeur 6= 0 et faux sinon. e 11.. e int ferror FILE *f D livre vrai si une erreur est d tect e sur f. alpha * e int fclose FILE *f Ferme f et d livre 0 si tout va bien.4.4. e else * stdin redirig sur .

s s quentiel par caract.

fputc  lit un caract. getc FILE *f .re e e e int int int int fgetc FILE *f .

et d livre EOF si la n de chier est atteinte ou si une e e erreur arrive . est quivalent .re sur f. l'instruction c = getc stdin .

c = getchar  . e a est quivalent .

putchar c . FILE *f . Renvoit le dernier caract. e a int ungetc intc..

re lu le param.

tre c sur le chier f : ce e e caract.

On ne peut pas faire deux unget successifs sans e intercaler une lecture. et EOF sinon. Cette fonction d livre c si elle s'est bien d roul e. On ne e e e peut pas renvoyer EOF ce n'est pas un caract.re sera celui que lira le getc suivant.

e *fgets char *ch. lit les caract. FILE *f .re. int n.

res sur f. jusqu'.

1 e a caract. ce que ou bien n .

ou bien une n de ligne soit rencontr e.res soient lus. Les caract.

FILE *f . Dans le m^me ordre d'id e. elle est stock e dans ch ou NULL en cas d'erreur ou de n ee e de chier. on se rappellera la fonction gets sur l'entr e standard e e e paragraphe 4.res lus sont rang s e e e e dans ch. int fputs char *ch. Si la n de ligne a t lue. Ecrit sur f les caract.2.

le caract.res de la cha^ne ch.

re nul non e e compris. D livre la dernier caract. et sans ajouter de n de ligne.

FILE *f .2. Ajoute c . stdout . char c.re crit ou EOF en cas d'erreur. char c. FILE *f . e e e Voir galement puts pour la sortie standard paragraphe 4. e putc c.

d livre le caract. f.

putc a e e e 11.re crit ou EOF en cas d'erreur.4 Acc.4.

s s quentiel par ligne compl.

te e e e char .

4. LES ENTREES SORTIES ET LES FICHIERS 61 11. 11.4.5 Acc.

 . D livre le nombre de caract.3.s s quentiel avec format e e int int fprintf FILE *f. Analogue au printf pour la sortie standard paragraphe 4. ::: char *format.

res crits ou une valeur n gative en cas d'erreur. Analogue au scanf pour l'entr e standard. e e e e char *format.  . D livre e e le nombre de valeurs assign es aux variables param.

tres. ou EOF si la n de chier est atteinte e e avant de pouvoir lire la premi.

11. e ::: fscanf FILE *f.re valeur.4.6 Acc.

D place la fen^tre du chier f de dep caract. int mode . long dep.s direct e int fseek FILE *f.

res. e e e .

en commenant au d but du chier si mode = SEEK SET constante qui vaut 0. ou en partant de la n du chier si mode = SEEK END 2. a la position c e courante si mode = SEEK CUR 1. On peut lire ensuite par les fonctions d'acc.

ou -1L en cas d'erreur.7 Manipulation des chiers *f . FILE * f .4.s s quentiel. long ftell D livre la valeur du d placement de la fen^tre de f. e e e int remove FILE int rename FILE d'erreur. D truit le chier externe associ a f. La fonction d livre EOF en cas d'erreur. D livre faux en cas d'erreur. e e. 11. et e e e 0 sinon.

Alloue un bloc de taille caract.4. D livre faux en cas e *ancien. e Renomme ancien par nouveau.8 Allocation dynamique Les fonctions d'allocation dynamique permettent l'allocation. 11. e ee void *malloc unsigned taille . la surallocation et la lib ration de e blocs de m moire rep r s par un pointeur. FILE *nouveau .

res et d livre une valeur de e e pointeur sur le bloc. e p void *realloc void *p. ou NULL en cas d'impossibilit . unsigned taille . Permet une surallocation pour le bloc rep r par ee et pr c demment cr e par malloc. ee e void *free void *p . lib.

on donne ici une structure rudimentaire de liste et une fonction d'ajout en t^te. e ee ee e A titre d'exemple. * pointeur de cr ation * e p =  struct elem * malloc  sizeof  struct elem .re le bloc rep r par p et cr par malloc ou modi par realloc. car malloc est de type p.suivant = tete . * t^te de liste * e void ajout en tete int x * ajoute x en t^te de liste * e f struct elem *p . p. g * forceur obligatoire. tete = p . struct elem *tete = NULL . void * * .n = x . e Exemple : struct elem * un entier + le lien vers le suivant * f int n . struct elem *suivant . g.

62 .

Donne la commande . CHAPITRE 11.10 Relations avec UNIX On utilise les fonctions math matiques en incluant le chier math. D livre un pointeur sur la valeur d'une variable de l'environnement e dont le nom est dans ch. ::: On devrait trouver dans stdlib. asin. LES FONCTIONS DES BIBLIOTHEQUES STANDARD 11.h plusieurs fonctions dont les suivantes qui permettent de manipuler certains objets UNIX : void exit int n . sin.9 Fonctions Math matiques e 11. On trouve : acos. exp. atan. tan. sqrt. fabs pour les ottants et abs pour les entiers. int system  char *commande . log.4.4. cos. Ainsi.h. d livre le code retour n pour le shell et termine l'ex cution de la fonction en e e cours. log10. char *getenv char *ch . Les arguments sont de type e double valeurs en radians pour les angles. on fera : e repertoire = getenv "HOME" . pour connaitre le r pertoire personnel.

UNIX pour qu'il l'ex cute.5 Exercice On reprend encore le module de gestion de piles abstraites. On veut cette fois que le mod. a e 11.

Rajoutez donc le param.le de e piles ne xe pas la taille de la pile.

et e allouez dynamiquement la pile dans ce constructeur. .tre taille au constructeur init.

Une directive commence par le e caract. et traite les directives qui lui sont adress es. le pr -compilateur analyse les sources qu'on soumet au compilateur e avant leur compilation.Chapitre 12 LE PRE-COMPILATEUR Comme son nom l'indique.

re di.

se  en premi.

Il a d'autres actions qui aident le compilateur : il joint les e e e lignes termin es par une contre-barre.re colonne. il ^te les commentaires. il concat.

et e o e il tient .ne les cha^nes adjacentes.

a 12. jour quelques variables qui lui sont propres.1 Directive de ne R.

gle e On a d j.

5 pour d nir des constantes. pr sent cette directive au paragraphe 2. identi cateur   texte Exemple :  de ne and &&  de ne P1600  de ne VOIRx Sans param. Rappelons sa ea e e e syntaxe : d claration de macro pour le pr -compilateur : e e  de ne identi cateur identi cateur .

tre et sans texte. define sert simplement .

d nir un identi cateur voir paragraphe e a e 12. Avec les parenth.2.

la directive sert .ses et un texte.

d clarer une macro-instruction param tr e e a e e e par les identi cateurs entre parenth.

Comme le texte peut commencer par une parenth.ses.

se. il ne e e peut y avoir d'espace entre le nom de la macro et la parenth.

se ouvrante.d n". x n La premi. e printf"-.

re d nition donne un substitut .

l'op rateur &&. la deuxi.

me d nit la "variable" P1600 e e a e e e sans lui donner de valeur. et la troisi.

me d nit la macro VOIRx qui a che l'entier pass en parae e e m.

1.tre. e La nouvelle norme a introduit deux op rateurs pour cette directive. e 12.1 Op rateur  e Exemple :  de ne VOIRx L'appel : Un param.

tre formel pr c d du di.

se dans une d nition de macro indique que le param.

tre e eee e e e e ectif doit ^tre entour de guillemets. Si le param.

tre e ectif contient lui-m^me un guillemet. ce e e e e dernier sera correctement trait n" .

e a printfx " = d n". x n 63 . la place de ".

LE PRE-COMPILATEUR VOIRindice printf"indice" " = d n". indice n printf"indice = d n".64 sera transform en : e puis en : CHAPITRE 12. cet op rateur plac devant ou derri. indice n Moins utile.

re un param.

tre formel indique que la valeur du e e e e param.

tre e ectif doit ^tre coll .

l'entit lexicale qui pr c.

de ou qui suit la param.

de faon .tre.

2 Directives de compilation conditionnelle Exemple :  if UC == PC  de ne LG 16  elif UC == CYBER  de ne LG 48  else  de ne LG 32  endif Les directives if. OUVRIRFfd. "w" .3 fd = open"temp3". ifndef.1. e 12. ifdef. L'expression ifdef PC est quivalente e e e e a . else. elif et endif permettent de faire de la compilation conditionnelle sur des expressions de constantes if ou sur le fait qu'un identi cateur du pr -compilateur est d ni ou non d ni ifdef. 12. "w" .2 Op rateur  e Exemple :  de ne OUVRIRFf. ne e e ea e ee e c a produire qu'une entit lexicale au lieu de deux. ifndef.n f L'appel : sera transform en : e = open"tempn".

3 Directive d'inclusion On a galement d j.  e e 12. l'action compil e est en fait encore une directive d nition du nombre de bits dans un mot d'un e e PC. et des minis. du Control Data du CICB. l'expression if de ned PC. mais c'aurait pu ^tre une s quence d'instructions C. Ici.

utilis la directive include : elle sert .

inclure le chier nomm en argument. e ea e a e Le nom du chier est entour de chevrons comme dans : e lorsque le chier appartient a la biblioth.

que C et qu'il se trouve dans le r pertoire usr include sous .

ou il est entour de guillemets comme e dans : quand le chier est un chier local de l'utilisateur. Un chier qu'on inclut peut lui-m^me contenir des directives d'inclusion.h n'est pas obligatoire. e include stdio. Le su xe .h include "mestypes.h" . e e Unix ou nTURBOCnINCLUDE sous MS-DOS avec Turbo-C.

IDENTIFICATEURS PREDEFINIS 65 Le pr -compilateur pr d nit les identi cateurs suivants dans les C nouvelle norme : e ee LINE num ro courant de la ligne source e FILE nom courant du chier compil e DATE date de la compilation TIME heure de la compilation STDC vaut 1 si le compilateur est a la norme .4.12.4 Identi cateurs pr d nis ee 12.

.

LE PRE-COMPILATEUR .66 CHAPITRE 12.

Annexe A SCHEMAS DE TRADUCTION LD EN C A. elles seront remplac es textuellement avant la e e e compilation.1 Constante Elles sont d nies au niveau du pr -compilateur .2 Type type Deux types de base. les bool ens et les caract. const c = 3.  de ne c 3 A. int pour les entiers.

res. avec des e e e options : un entier peut ^tre court short. caract. oat pour les r els.

Si ti est .4 Instructions Les instructions ont ou n'ont pas de point-virgule les terminant : voir la syntaxe pr cise dans e chaque cas. Par exemple. var v : constructeur de type . A. untype v . var Exemple : v : tableau 1. si ti est une a ectation.5 de t . typedef d finition du e type t . ti sera a faire suivre du point-virgule. long long ou sans signe unsigned e e On peut d nir de nouveaux types par une d claration de type : e e ::: t = d finition e du type . d pend du constructeur de e type t v 4 . Dans la suite.3 Variable var v : untype . une instruction ti est laiss e sans point-virgule ce n'est pas un s parateur e e d'instructions.. A.re char.

consistant . alors on emploie une instruction compos e. une suite d'instructions.

67 . encadrer ti par des e a accolades fg.

1 S lections e cas c1 .. cn aut ! t1 fcas ! tn ! tn+1 if c1 t1 else if .. SCHEMAS DE TRADUCTION LD EN C A.4. else if cn else tn+1 tn Cas particulier o.68 ANNEXE A...

break .. t2 . break . case vn : tn . break . break . break . ev2. ev2. switch etat f case ev1 : s1 . qd qd cond1 sortir par sortir par do f t1 if t2 . * jusqua etat != boucle * cond1 cond1 g g g fetat fetat = ev1 .. break . ev2 . . case ev2 : s2 . cond2 . le cas porte toujours sur le m^me facteur : u e cas fcas exp = v1 t1 . default : tn+1 g A. if refaire sortie sortie sortie ter ev1 : s1 ev2 : s2 ev3 : s3 g g while etat == boucle . break . i+=p . f enum fboucle.... i =f . g Boucle avec sortie en t^te : e jqa ev1 faire qd cond1 sortir par t1 refaire Boucle pour ev1 . t . ev3 jqa faire ev1 .2 It rations e Boucle g n rale LD ee ev1.4. while  ! t1 cond1 pour i depuis d pas t refaire p jqa f faire for  i=d . exp = vn tn aut tn+1 ! ! ! switch exp f case v1 : t1 . = ev2 .. ev3 etat = boucle . t1 . tn ev1. tn ... case ev3 : s3 .

A. SOUS-PROGRAMMES 69 Seules les fonctions existent. elles sont toutes d clar es au m^me niveau que le programme principal e e e fonction main.5. Un seul mode de transmission de param.

Pour transmettre en r sultat e e un objet qui n'est pas un tableau.tre : par valeur.. untableau t . t2 *x.. var . t :untableau . i :t1 mod var void f g x :t2 . n.. pt1 i..5 Sous-programmes procedure p xe debut . A. on transmet son adresse.

70 ANNEXE A. SCHEMAS DE TRADUCTION LD EN C .

Annexe B CORRIGES DES EXERCICES B. case if else break default erreur de frappe * g if bon printf"dnn". b. '-' : r = a . &b .h define TAILLE 10 71 . * 2 op randes et le r sultat * e e int bon . . * g g switch f case break . &operateur. '' : r = a  b . '*' : r = a * b .1 Chapitre 5 include stdio. B. case break . else printf"****nn" . case break . case break . r . : bon = FAUX . r . * bool en le calcul est-il faisable ? * e char operateur . &a. ' ' : b == 0 bon = FAUX . bon = VRAI .2 Chapitre 6 include stdio.h define VRAI 1 define FAUX 0 void main f int a. * l'op rateur * e while 1 f scanf"d c d". r = a b. operateur '+' : r = a + b .b .

etat == on lit scanf"d". fini etat . &n == EOF etat = fini . * boucle de lecture * nb = 0 . * est bon. i = 0 . * tab est vide au d part * e etat = on lit . CORRIGES DES EXERCICES * tableau n cessaire pour le tri * e * indices dans tab * * dernier entier lu * * nombre d'entiers dans tab * trop. * il faut ajouter n dans tab * nb == TAILLE etat = trop .72 ANNEXE B. il faut ins rer n .

int nb . i-.. j . enum fon lit. int n . while f if else if else f g g g if etat == trop printf"trop d'entiers .1 . n tab i . .1 && i 0 tab i = tab i . sa place * c e a i = nb . void main f int tab TAILLE int i.

* mise a . a else f for i = 0 . tab i  . nb = nb++ . include stdio. trier ! n" .h main x = 4. pp = &p . *p . i nb . p = &x .3 Chapitre 7 1. n B. **pp = 0 . printf"nn" . g g tab i while f g = n . i++ printf"d ". **pp .

void f int int int g n 0 de x par double indirection * 2. include stdio. i . printf"d n".h define TAILLE 10 .

4. CHAPITRE 8 73 int tab TAILLE = f1. 10g . 0. 0. void main f int *deb = &tab 0 . 0.4.B. * rep. 3. 6. 0. 9.

* parcours * for  p = deb . int s f heures = h . n void Etablir heure int h. heures 1 ? 's' : ' '. Afficher heure . if minutes = 60 f minutes = 0 . p = fin . secondes = s . int m. p . heures. p++  if *p == 0 printf"d ". 59. if secondes = 60 f secondes = 0 . * Module de gestion de l'heure * stdio. secondes.re le 1er entier * e int *fin = &tab TAILLE .4 Chapitre 8 1. Etablir heure23. Afficher heure .h * include int heures. g B. heures += 1 .1 . minutes = m . minutes 1 ? 's' : ' '.deb . 23 . secondes 1 ? 's' : ' ' . Afficher heure . Afficher heure . void Afficher heure void f printf"Il est d heurec d g l'heure. * valeur relative * printf"nn" . if heures 24 heures = 0 . g . minutes += 1 . globale au module * minutec d secondec n". tic . secondes . tic . 59 . * dernier * int *p . 59. minutes. g g g void main void f Etablir heure1. g void tic void f secondes += 1 . minutes.

*c = *c + cle  26 . g void main void f int i .26 . char *c f enum fmajuscule. while n * Crypter un caract.h texte = "On veut crypter un texte selon le principe du n d calage des lettres.74 ANNEXE B. t++ . e * char nn void Crypter car int cle. g void Crypter texte int cle. char f while *t Crypter carcle. else if *c = 'A' && *c = 'Z' sorte = majuscule ." . else return . include stdio. * sorte de lettre * if *c = 'a' && *c = 'z' sorte = minuscule . * codage : r tablir une lettre si on d borde * e e if sorte == minuscule && *c 'z' || sorte == majuscule && *c *c = *c . CORRIGES DES EXERCICES 2. minusculeg sorte .

Crypter texte2. printf" nTexte apr.re * e 'Z' Crypter un texte * *t g printf"Texte avant cryptage : i = 0. texte . texte i  printf"c".

while n texte i++  .5 Chapitre 9 * Le module de gestion de la pile est le suivant : module de gestion d'une pile de "cha^nes" * * * * typedef char chaine 20 . B. texte i++  . g void depilerchaine c type des l ments de la pile * ee sommet de la pile * "la" pile * .s cryptage e i = 0. nn n " . void empilerchaine c f strcpypile s++ . printf" n" . static chaine pile 50 . static int s = 0 . texte i  printf"c". c . : n " .

extern void depiler . Le programme client inclut le chier d'en-t^te : e * Lecture d'un texte.h" et a chage . CHAPITRE 10 75 f g strcpyc. extern int pilevide . f return g void int pilevide void f return s 0 .h include "pile. d nissant ce que son client doit conna^tre et donc ce qui est accessible. pile s-. chaine* sommet  chaine*pile s . extern void empiler . est d clar e e e dans un chier d'en-t^te.6. extern chaine* sommet . . include stdio. g Son interface. appel ici pile.B.h : e e * Interface du module "pile de cha^nes" * typedef char chaine 20 .

g Le programme de lecture et a chage ne fait pas appel . l'envers * a void main void  f chaine x .x != EOF empilerx . printf"s ". g while  !pilevide . do f depilerx . x . while scanf"s". printf"nn" .

6 Chapitre 10 * Le module de gestion du type abstrait pile est le suivant : module de gestion du type abstrait pile de "cha^nes" * chaine 20 . * typedef char type des l ments de la pile * ee . e printf"s". Pour a cher la cha^ne a en sommet de pile. sommet . l'accesseur sommet. il crit . B.

s-. compos de * e son sommet * et de "la" pile * chaine* sommetPILE *p chaine*p.pile p. g f return g type abstrait PILE.s = 0 . . chaine c f strcpyp. g void initPILE *p f p. chaine pile 50 . chaine c f strcpyc. CORRIGES DES EXERCICES * * * typedef struct f int s . p. g Tous les acc. void empilerPILE *p.s 0 . int pilevidePILE *p f return p.s++ .pile p.pile p. g void depilerPILE *p. c . g PILE .76 ANNEXE B.s .

s .

la structure se font via le rep.

re p qui pointe sur un article. et a chage * via le type abstrait PILE * include stdio.h" a l'envers * . * et le programme utilisateur devient le suivant : * Lecture d'un texte. extern void depiler . extern int pilevide . extern chaine* sommet . extern void init . typedef struct f int s . g PILE .h : * Interface du module "pile de cha^nes" * sommet de la pile * * "la" pile * typedef char chaine 20 . chaine pile 50 .h include "pileab. extern void empiler . L'interface connu des e a e utilisateurs est dans le chiers pileab.

 * PILE ma pile . la pile n cessaire au traitement * e . void main void f chaine x .

CHAPITRE 11 init&ma pile . x . x . x .  !pilevide&ma pile .B. printf"s ". 77 g while do f g while n La seule chose .7.x != EOF empiler&ma pile. scanf"s". depiler&ma pile. printf" n" .

pile++ .. p. int taille * initialise a vide une pile de taille "taille" * ... type des l ments de la pile * ee type abstrait PILE. void empilerPILE *p. strcpyc. *p. chaine *pile .s++ . chaine c f strcpy*p. typedef struct f int s . p. g PILE .7 Chapitre 11 * * Le module de gestion du type abstrait pile subit beaucoup plus de modi cations que ses clients : module de gestion du type abstrait pile de "cha^nes" * la taille de la pile est dynamique * * * * * typedef char chaine 20 . ss-. g void depilerPILE *p. g chaine *sommetPILE *p chaine *ss = p. p.s 0 . chaine c f p.pile-. c . sans taille * f g return int pilevidePILE *p f return p. a ee B.pile . g void initPILE *p. compos de * e son sommet * et de "la" pile.pile .s-.pile. chaine* *ss . ne pas oublier est de transmettre la pile ma pile par r f rence au module de pile.

Cette sp ci cation nouvelle entra^ne une seule modi cation e chez le client : il faut donner la taille de la pile lors de son initialisation.pile = chaine* malloctaille * sizeofchaine . p.h. il s'appelle pileabv. f p. . g Seules les sp ci cations de la proc dure d'initialisation ont chang dans le chier d'en-t^te qu'on ne e e e e recopie pas ici .s = 0 .

et a chage a l'envers * . CORRIGES DES EXERCICES * Lecture d'un texte.78 ANNEXE B.

h include "pileabv. * via le type abstrait PILE de taille dynamique * include stdio.  !pilevide&ma pile . &x != EOF empiler&ma pile. x . printf" n" . init&ma pile. la pile n cessaire au traitement * e allocation et initialisation de ma pile * .h" void main void f chaine x . x . * scanf"s". 15 . while do f g while n  g * PILE ma pile . x . depiler&ma pile. printf"s ".

Index adressage indirect 32 adresse 31 a ectation 12 allocation des articles. 54 en param. 54 allocation dynamique 61 argc 42 argv 42 article 51 compactage.

29. 25 break 25 cas instruction 23 cha^nes 2.tre. 52 e attribut d'une variable 48 bloc 21 bool en 7 e branchement 23. 57 char 6 classe d'allocation 9 commentaire 2 commutativit 11 e comparaison 12 const 48 constantes 8 continue 26 conversion de param.

tre. 55 d calage 12 e d clarateur 39 e d claration e de fonction. 37 de pointeur. 31. 13 par type union. 14 e explicite. 34 de tableau. 34 de variables. 13 implicite. 8 des param.

37 e ordre des d clarations.tres formels. 35 e 79 default 23 de ne 8 d nitions de type 7 e d passements de capacit 11 e e di rence 12 e divisions par z ro 11 e do 22 double 6 criture e format e. 47 e d cr mentation e e op rateur. 45. 18 e par caract.

17 ee e par caract. 17 galit 12 e e entiers 2 entit de compilation 45 e entit s lexicales 1 e entr e-sortie e format e. 60 e par ligne. 19 e g n ralit s. 17.re.

17 e par ligne. 17 enum 7 EOF 17.re. 59 et bit a bit 12 .

12 expression s quentielle. et logique 11 tiquette 21. 11 e conditionnelle. 21 logique. 11 sur les bits. 25 e expression-indic e. 12 expressions relationnelle 12 extern 46 chier 59 acc. 14 d'a ectation. 28 e instruction. 25 e ex cutable 3 e expression arithm tique.

s direct. 61 e fermeture. 59 ouverture. 59 FILE 59 .

47 de type article.80 n de chier 17 oat 6 fonction 37 appel. 14 composition. 52 en param.

46 type d'une fonction. 11. 35 e de d cr mentation. 31 . 52 priorit .. 12 d'incr mentation. 46 locale. 11 op rateur virgule. 46 globale. 15 e prise d'adresse. 41 e externe. 35 d'adressage indirect. 31 sur les articles. 32 d'a ectation. 46 prototype. 35 &. 32 ++. 51 sur les bits. 12 logique. 25 e point.. 12 sur les caract. 38 for 24 forceur 13 getchar INDEX mot-cl 3 e n gation 11 e NULL 32 op rateur e *. 35 e e de relation.tre.

54 organisation des objets 48 ou bit .es. 11 r sur les entiers. 11 sur les pointeurs. 32 taille.

bit 12 a ou exclusif bit .

bit 12 a ou logique 11 param.

37 e fonction. 41 param. 52 d claration.tre e de type structure.

tre e ectif. 38 e param.

31 e port e 45 e pour instruction 24 programme 3 prototype de fonction 46 putcharc 17 register 48 r.tre formel. 38 pointeur 31 d claration. 38 e r sultat. 40 transmission. 40 e tableau.

21 instruction cas. 24 instruction r p ter. 28 des articles.gle de visibilit 38 e e r p ter instruction 22 ee s parateurs 2 e short 5 si instruction 23 goto 25 17 grammaire 3 identi cateur 2 identi cation 12 if 23 incr mentation e op rateur. 22 instruction vide. 23 instruction compos e. 19 e par caract. 53 instruction 21 branchement. 24 int 5 lecture format e. 23 instruction tantque. 22 ee instruction si. 21 instruction pour. 21 e instruction expression. 35 e initialisation de tableau. 25 instruction bloc.

re. 17 e par carat.

60 tamponnage du clavier. 60 e par ligne. 20 litt ral e caract.re. 17.

re. 6 e long 6 3 manipulation de bits 12 mode de transmission des param.

tres 38 e module 45 main .

33 volatile 48 sizeof 54 sortie de boucle 25 static 45 59 59 59 struct 51 structure 51 stderr stdin stdout while 22 'nn' 6 voir aussi article. 51 structure d'un programme 3 switch 23 tableau 27 adresse de.INDEX 81 virgule op rateur 25 e visibilit 38 e void 7. 27 e en param. 28 d claration.

28 initialisation. 27 type bool en.tre. 28 plusieurs dimensions. 38 d nition. 7 e type num r . 40 e indexation. 7 e di rents types. 5 e structure. 7 e ee types caract. 51 tableau. 51 d'une fonction. 27 taille d'un objet 54 tantque instruction 22 type article.

5 types entiers.res. 46 globale. 52 classe. 6 e types de base. 48 champ d'article. 55 void. 45 organisation. 48 d claration. 45 locale. 6 e union. 5 types r els. 28 e . 7 typedef 7 union 55 union 55 unsigned 6 valeur de pointeur 31 variable allocation dynamique. 8 e externe. 61 attribut. 48 variable indic e.

Sign up to vote on this title
UsefulNot useful