INTRODUCTION AU LANGAGE C

char rahc [ ] = "\n/" , redivider [ ] = "Able was I ere I saw elbA" , * deliver,reviled = 1+1 , niam ; main ( ) {/*\} \*/ int tni = 0x0 , rahctup,putchar ( ) ,LACEDx0 = 0xDECAL, rof ; for (;(int) (tni);) (int) (tni) = reviled ; deliver = redivider ; for ((int)(tni)++,++reviled;reviled* *deliver;deliver++,++(int)(tni)) rof = (int) -1- (tni) ;reviled--;--deliver; (tni) = (int) - 0xDECAL + LACEDx0 rof ; for (reviled--,(int)--(tni);(int) (tni);(int)--(tni),--deliver) rahctup = putchar (reviled* *deliver) ; rahctup * putchar ((char) * (rahc)) ; /*\ {\*/}

C
Bernard Cassagne

Bernard Cassagne

Introduction au langage C
norme iso ansi

Laboratoire clips Universit Joseph Fourier & cnrs e Grenoble

Copyright 1997-1998 Bernard Cassagne Ce texte est copyright et n'est pas dans le domaine public. Sa reproduction est cependant e autoris e a condition de respecter les conditions suivantes : e

Si ce document est reproduit pour les besoins personnels du reproducteur, toute forme de reproduction totale ou partielle est autoris e. e Si ce document est reproduit dans le but d'^tre distribu

de tierces personnes : e ea il devra ^tre reproduit dans son int gralit sans aucune modi cation. Cette e e e notice de copyright devra donc ^tre pr sente. e e il ne devra pas ^tre vendu. Cependant, dans le seul cas d'un enseignement e gratuit, une participation aux frais de reproduction pourra ^tre demand e, mais e e elle ne pourra ^tre sup rieure au prix du papier et de l'encre composant le e e document. Toute reproduction sortant du cadre pr cis ci-dessus est interdite sans accord pr alable e e e de l'auteur. Un chier PostScript contenant ce document est librement accessible par l'url :
ftp: ftp.imag.fr pub DOC.UNIX C Introduction ANSI C.ps

Version de ce document : 2.1 de juin 1998

Table des mati

res e
1 Les bases
1.1 1.2 1.3 1.4 1.5 Les versions du langage C . . . . . . . . . . . . Langage et biblioth

e Les phases de compilation . . . . Les jeux de caract. . . . . . . .que standard . . . . . . . . .

. . . e 1. . . . . . . . . . . . . . . . Les commentaires . . . . . . . . . . .1 Les caract. . . . . .1 Les mots-cl s . . . . . . . .res . . e Les unit s lexicales . . . . . . . . . . . . . . .5. . . . . . . . . . . Les types de base . . . . . .5. . . 1. . . .2 Les identi cateurs . . . . . .7. e 1. . . . . .

. . . . . . . . . . . . .3 Les ottants . . . . .8. 1. . . . . . . . . . . . .res . . . . Les constantes . . . . . . 1.7. . . . . . . . . e 1. . . . .1 Les constantes enti. . . . . . . . .2 Les entiers . . . .7. .

.2 Les constantes caract. . . .8.res . . . e 1. . . .

. .8. . . . .res . . . . .3 Les constantes ottantes . . . . . e 1. . Les cha^nes de caract.

. . . . . . . . . . .1 L'a ectation . . . . . . . . . . . . . . . . . 1. . . . . . . . . . . . . . . . . . . . Inclusion de source . . . . . . . . . . .12. . . . . . . .14 1. . . . . . . . . .13. . . . . . . . . . 1. . . . . . . . . . .12.12. . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 . . . . . . . . .2 L'addition . . . . . . . . . . . . . . . . . .3 Instruction if . . . . . . . . . .13. .1 Les de ne . . . . . . . . . . . . .2 Instruction compos e . . e iii . . . . .12 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12. . . . .4 La multiplication . . . . . . .2 Les num rations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12. . . . . . . . . . . . . . . . . . . . . . . . e e Les constantes nomm es . . . . . . . . . . . . . . . . . . . . . . .5 La division . .13. . . . . . . . . . . . . . . . . . . . . . . .3 La soustraction . . . . . . . . . . . . . . . . . . . . . . . . e 1. . . . . . . . .13 1. . . . . . . . . 1. . 1. . . . . . . . . . . . . e 1. . . . . . e 1. . . . . . . . . .10. . . . . . . . . . . . . . . . . Les proc dures et les fonctions . . . . .12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .res litt rales . .9 1. . . . . . . . . e Les instructions les plus usuelles . . . . . . . . . . . . . . . . . . .6 1. . . . . . . . . . . . . . .12. . . . . . . . . . . . . . . 5 5 6 6 6 7 7 7 10 10 10 10 11 11 11 13 14 14 15 15 16 16 16 17 17 18 18 18 19 19 19 20 20 21 22 5 1. . . . . . . . . . . . . . . . . . . . . . .10 1. . . . . . . . . . . . . . . . . . . . . e e D clarations de variables ayant un type de base e Les op rateurs les plus usuels . . . . 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 Les op rateurs de comparaison . . . . . . .11 1. . . . . . . . . . . . . . . 1. . . 1. . . . . . . . . . . . . . . . . . . . .10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 1. . . . . . . . . . . . e 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Instruction expression . . . .7 1. . . . . . . . . 1. . . . . . . . .6 L'op rateur modulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .15. . . e 1. . . . . e e 1. . . . . . . . . .1. . . . .19 1. . . .15. . .4 Fonctions imbriqu es . . . . . .15. . . . . 1. .21 1.3 Les proc dures . . . . . . .1 D nition d'une fonction . . . . . .18 1. . . . .15. .6 R f rence . .15. . . . e 1. . . . . . . . . . . . . . . .2 Appel d'une fonction . .16 1. . .15. . . . . . . . .20 1.5 R cursivit . e 1. . . . . . . . . . . . . . .17 1. .

une fonction externe . . . .15. . . . . . . . . . . ee a 1. .7 Comprendre la documentation de la biblioth.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mise en oeuvre du compilateur C sous UNIX . . . . . . . . . . . . . e Structure d'un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 1. .8 Les fonctions dans le style K&R . . . Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 D claration de tableaux dont les l ments ont un type de base e ee 2. . . . . . . . . e e . . 22 24 25 25 25 26 26 26 27 28 29 29 29 33 2 Les tableaux 2. . . . . . . . . . . . . .15. . . . .que standard . . 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. . . . . . . . . . . . . . . . . . . . . . . . . .2 Initialisation d'un tableau . . .3 R f rence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Impression formatt e .1 Les tableaux . . . . . . . . . . . . . . . . . . . . . . . .1. . .1. .1. . . . . . . . . . . . . . . . . . . . R cr ation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminaison d'un programme . . . . . . . . . . . . . . . . . . . . . . . . . . .

1. un l ment d'un tableau . . . . . . .4 Cha^nes et tableaux de caract. . ee a ee 2. . . . . . . .

. . . .6 Op rateur non logique . . . . . . . . 2. . . . . . . . . . . . . . .2 Op rateur pr et postd cr ment . . . . . . . .7. . . . . e iv 45 45 45 45 46 46 47 49 49 49 50 .1 3. e 2.3. . . . . . . 2.4 3. . . . . . . . . . . . . . . . . . . Pointeurs et op rateurs additifs . . . . . .1 Instruction for .7. . . . .2. . . e 2.2 Op rateurs ++ et -. . . . . . . . . . . . . . . .5 Op rateur ou logique . . . . 2. . . . . . . . .7 Notion de pointeur . . . . . . . . . . . e 2. .3. . . . . . . . . . . . . . . . . . . . . . .2.5 Instruction continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .res . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . .4 Op rateur et logique . . . .. . . . 35 35 35 36 37 37 37 37 38 39 39 40 40 40 41 41 42 42 43 43 3 Les pointeurs 3. . . . . . . . . .4 Exercice . . . . . . . . . . . . . . .3 Quelques utilisations typiques de ces op rateurs . . . . . .5 3. . . . . . . . . . . e 2. . . . . . .4 Instruction break . . . . .3 Les op rateurs . . .2 Les instructions it ratives . . . . . . . . . . . . . . . . .3 3. . . . . . . . . . . . . . 2. . . . . .3. . . . . . . . . . . . . .1 Op rateurs + et . . . . . . . . . . . . . . . . . . ee Op rateur adresse de .2 Instruction while . e 2. . . . . . . . . . . . . . . . . . . . e 3. . . . e Op rateur d'indirection . . . . . . . . . . . . . . e 3. . . . . . . .2 3. . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . e e e e 2. . .6 3. . . . . . . . . . . . . . . . . .2. . .. . . . . . . . . . . .3. . . . e 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . . . . . . . .3 Instruction do . e 2. . . . . e 3. . . . . . . . . . . . . . . . . . . . . . . .8 Di rence de deux pointeurs . . . . . . . .3. . . . . . . . . . . .1 Op rateur pr et postincr ment . . . e e e 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . e Exercice . . . D clarations de variables de type pointeur vers les types de base e Type de pointeur g n rique . . . . . . 2. .

. . . .10 Passage de param. .3. . . . . . . . . . . . . . . . . . . . . .9 Exercice . . . . . . 3. . . .

. . e 3. . . . .2 Comment les langages de programmation satisfont ces besoins . . . . . . . . . . . 3. . . . 3. .10. . .12 Une derni. . . . . .1 Les besoins du programmeur .3 La strat gie du langage C . . . . .10. . . . . . . . . . .10. .11 Discussion . . . e 3. . . . . . . . . . .tres . . . . . . . . . . 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . e 3. .re pr cision . . . . . . . .15 Les derni. . . . . . . .13 Exercice . . . . . . . . . . . . . . . . . . . . .14 Lecture formatt e . . . . . . . . . . 3. . . . . . . . . . . . . . . e e 3. . . . . . . . . . . . . . . . .

. . . . . . . 3. . . . . . . . . . . . . . . . . . . .15. . . . . . . . . . . . . . . . . . . . . .17 R cr ation . . . . . . .res instructions . . . . . . . . . . . . . . . . . . . . .12 4. e e . . . . . . . .11 4. .15. . . . . . 3. .13 4. . . . .16 Exercice . . . .9 4. . e Passage de tableau en param. . .2 4. 50 52 52 52 52 53 53 54 56 56 57 59 59 60 63 4 Relations entre tableaux et pointeurs 4. . . . . . .3 Instruction nulle . . . .1 Instruction switch . . . . . . . . . . . . . . . . . . . . . . . 3. .5 4. . . . . . . . . . . . . . . . . . . . . . . . .10 4. . . . . . . . . . . . . . . . .1 4. . . . . . . . . .8 4. .4 4.3 4. . . . . . . . . . . . . . . . . . e 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Instruction goto . . . . . . . . . . . . . . . . . . . . . .14 Conversion des tableaux .7 4. . . .6 4. . . . . . . .15. . L'op rateur d'indexation . . . 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . e Modi cation des l ments d'un tableau pass en param. . . . . .tre . . . . . . . . . . . . . . .

. . . ee e e Interdiction de modi cation des l ments d'un tableau pass en param. . . .tre . .

. . . .1 D clarations . . . . . . . . . Exercice . . . . . . . . . . . . . . . . . . . e 4. . . . . . . . . . . . Tableaux multidimensionnels . . . . . . . . . .tre ee e e Conversion des cha^nes litt rales . . . . . . . . . . . . . . . e Retour sur printf . . . . . . . . . . . . . . . . . . . . . . . . . .9. . 4. . . . . . . . . .2 Acc. . . . . . . . . . . . . . . . . . . . . . . . . . . .9. . . . . . . . . . . . . . . . .

. .9. . . .s aux l ments . . . . .3 Passage en param. . . . . . . . . . . . . e ee 4. . . . . .

. . . . . . . e Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12. . . . . . . . . . . . . .tre . . . . . . . .3 Param. . . . . . . . . . .12. . . . Exercice . . . . . . Tableau de pointeurs . . . . . . . . . . . . . . . . .12. . . . . . . . . . . . . . . . . . 4. . .2 Tableaux de pointeurs vers des cha^nes . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Cas g n ral . ee 4. . . . . . . . 4. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .2 fermeture d'un chier : fclose . . . . . . . . . . . . . . .tres d'un programme . . . . . . . . . . . . 5. . .2. . . . . 5. . . . . . . . . . .13. . .3 Lecture et criture par caract. . . . . . . . . . . . . . . . . . . . . .2 Ouverture et fermeture de chiers . . . . . .13. . . . . . . . . . . . . c'est la m^me chose? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Pointeur invalide . . . . e R cr ation . . . . . . . . . . . .2 Cas particulier des cha^nes litt rales . e 4. . 65 65 66 67 68 69 69 70 70 72 72 72 72 73 73 75 75 76 77 78 78 78 79 5 Les entr es-sorties e 5. . . . . . 5. .1 Commentaires . . 4. . . . 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Ouverture d'un chier : fopen . .2. . . . . . . . . . e e . e Tableau et pointeur. . . . . . . . . . . . . . . . . .

1 lecture par caract.3.re sur chier e e 5.

.re : fgetc . . . e v 81 81 81 81 83 84 84 . .

7 5.4 5.5.8 5.3.5 5.6 5.2 lecture par caract.

. . . e 5. . .3 lecture par caract.3. . . . .re : getc . .

. e 5. . . . . . .re : getchar . .4 criture par caract.3.

. .re : fputc .3. . . e e 5.5 criture par caract. . . . . .

. . .6 criture par caract.3. . . . . .re : putc . . . e e 5.

. . . . . . . . .4 Exemples d'utilisation des formats . . e e 5. . . . . . . . . e 6. . . . 105 . . . . . . .4 criture par cha^ne : puts . . . . . . . 100 .5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . .5. 105 . . . . . .5. .4. 5. . . . . . 94 . . . . . . . . 5. . . . . . . . . . . 114 . . 103 . .6 Entr es formatt es : scanf . . . . . . . . . . 110 . . . . . . . . . . 107 . . . . . . . .5 Entr es formatt es : fscanf . 115 . . . . . e 5. . . . . . .3 criture par cha^ne : fputs . . . . . .3 Op rateurs sur les structures . Exercice 2 . . . . . .5. 107 . . . 89 . . 86 . . 86 . . . . . . 88 . . . . . . . . e e 5. . 85 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 . . .5. . 108 . . 84 . . . . . . . . 116 .5. . . . . . . . .1 Acc. . . . e 5. . . . .5. . . 110 . . . . . . . . . . 115 . unions et num rations e e 6. . .4. . 105 . . e 5. . .1 Ecriture formatt e : fprintf . . . . .1 lecture par ligne : fgets . . 109 . . . 100 . . . . 109 . . . . . . . . . . . . . .2 lecture par ligne : gets . . . . . . . . . . . . . . . . 94 . . . e e R cr ation . e criture formatt e dans une cha^ne : sprintf . . . . . e e Lecture et criture par lignes sur chier . . . . . . . . . . . 105 . . . . . . . . . .7 Entr es formatt es depuis une cha^ne : sscanf . . . . . . . 89 . . 93 . . . . . . . . . . . . . . . . . . . . . . .3. . . 99 .2 Ecriture formatt e : printf . . . e 6. . 85 . . . . . . . . . 5. . . . . . . . . . . . e 5. . . . . . . . . . 103 . . . . 99 . . . . . . . . . . . . . . . . . . e e Exercice 1 . . . 107 . . . . .2 D claration de structure . . . . . . . . . . . . . . . . . . . 100 . . . . 105 . . . . . . . . . . . . e E S formatt es sur chiers . . . . . . 92 . . . . . . . . . 109 . . . . 6. . . 109 . . .re : putchar . . . . . 116 6 Structures. . . . . . . . . 86 . . . . . . . . . . . 87 . 86 . . 114 . . . . . . . . . 87 . . . . . .3 E e 5.1 Notion de structure . .4. . . . . . 5. . . . .

. . . . . . .8 Acc. . . .3 Comparaison de structures . . . . . . . . . . . . . . . .3.7 Structures dont un des membres pointe vers une structure du m^me type e 6. . . . . . . . . . . . . . . . . . . . . . . .4 Tableaux de structures . . e 6. . . 6. . . . . . . . . . . 6. . . . . . . . . . . . . . . . . . . .5 Exercice . . . . . . . . . .3. . . . 6. . . . . . . . . . 6. . . . . . . . .6 Pointeurs vers une structure . . . . . . . . . . . 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 A ectation de structures .s aux membres des structures . . .

. . . . . . . . .s aux l ments d'une structure point e . . . . . e ee e 6. .9 Passage de structures en param. . .

. . . . . . . . . . . . . .tre . e e . .10 D termination de la taille allou e a un type . . e 6. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . .10. . .2 Lib ration d'espace : proc dure free .13 Les champs de bits . . . .2 Contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . . . . . . . . . . . . . . . . . . .14 Les num rations . . . e e 6. . . . . . . . . . . . . . . . . . . . . e e 6. . 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . .13. . . . . .12 Exercice . . . . . . .15 Les unions . . . . . . . . . . . . . . .11. . . . . . . . . . . . . . . . 6. . .1 Allocation d'espace : fonctions malloc et calloc . ee e 6. . . . . . . . . . . .11. 6. . .1 G n ralit s . . . . . . . . . . . . . . . . . .11 Allocation et lib ration d'espace pour les structures . . 6. e 6. .16 Acc. . . . . . . .13. . . 6. . . . . . . . . . . . . . . . . .1 Retour sur la conversion des tableaux . . . . . . . . . . . . . . . . . . .

. . . e vi 103 . . . . . . . . . . . . . . . .s aux membres de l'union . . . . . . .

6. . . . . . 116 6. . . . . . . . . . . . . . . . . .17 Utilisation pratique des unions . . .18 Une m thode pour all ger l'acc.

117 e e e 7 Les expressions 7. e 7. . .7 Les surprises des conversions . . . .1. . . .6 Les conversions arithm tiques habituelles e 7. . . . . 7. . . . . . . . . . . . . . 7. 7.4 Les situations de conversions . . . . . e 7.1.1. .5 La promotion des entiers . . .2 Ce qu'il y a dans une conversion .1.1 Op rateur non bit . . . . . . . 7.1 Les conversions de types . . . .1. . . . 7.1. . 7. . . . . . . .3 L'ensemble des conversions possibles . . . .2 Les op rateurs . .s aux membres . . . . . . . . . .2. . . . . . . . . . .1. .1 Utilit des conversions . . . . . . .

. . . bit .2 Op rateur et bit . . .2. . . e a 7. . .

. e a 7. . bit .3 Op rateur ou bit . . . . . . . .2. .

. . . .4 Op rateur ou exclusif bit . . . . . . e a 7.2. . bit .

5 Op rateur d calage . . .2. e a 7. . . . . bit .

.6 Op rateur d calage . . e e a 7. gauche .2. . . . .

. . . 124 . . . . . 125 . . . . . 131 . 129 . . . . . . . . . . . . . . . . . . . . . . 129 . . e e a 7. . . . . . . . . . . . e 7. . e 7. . . . . . . . 127 . . . . . . . . . . . . . 126 . . . . . . . . . . . . . 121 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Priorit et associativit des op rateurs . . . . . . . . . . . . . . . . . . . . . . . .4 S mantique des expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. 133 . . . .4. . . . . . . . . . . . . . . . . . . . . . . e e . . . . . . . . . . . . e 7. 125 . . . 138 . . . . . . . . . . . . 133 . . . . . . . . . . . . . . e e 7. . . . . . . . . . . . . . . . e 7. . . . . . 120 . . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 . . . . . . . . . . . .7 Op rateur conditionnel . . . . . . . . . . . . . . . . . . . 124 . droite .8 Op rateur virgule . . 141 119 8 Le pr processeur e 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 . .2. . . . . . . . . . . . . . . . . . . 131 . . . . . 127 . . . . . .1 Les macros sans param. . . . . 121 . 125 . . . . . . . . . . . . . . . . . . . . . . . 122 . . . .3 Op rateur conversion . . . . . 135 . . e 7. . . . . . . . . . . e e e 7. . 139 . . . 120 . . . . . . . . . . . 135 . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . .5 R cr ation . . . . 140 . . 140 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1 Op rateurs d'adressage . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . .2. . . . . . . . . . . . . . . . . . . . . . 140 . . . . . . . . . . . .9 Op rateurs d'a ectation compos e . . . . . . . . 119 . . . 129 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Traitement de macros . . . . . . . . . . 140 . . . . 125 . . . e e 7. . . . . . . . . . . 137 . . . . . . . . . . . . 123 . . . . . . . . . . . . . .3 Ordre d' valuation des op randes . . 139 . . . . 125 . .

. ee 8. . e 8. . .1. .3 Les macros avec param. . . .2 Macros pr d nies .1.tres . .

.tres .4 Les pi. .1. e 8.

ges des macros . . . . . . e 8.1.5 Macros g n rant des instructions ee 8.2 Compilation conditionnelle . . . . . . . 8.2.1 Commande if . . . . . . . . . . 8.2.2 Commandes ifdef et ifndef . 8.2.3 L'op rateur defined . . . . . . . e 8.2.4 La commande error . . . . . . 8.2.5 Usage . . . . . . . . . . . . . . . 8.3 R cr ation . . . . . . . . . . . . . . . . . e e vii

133

9 Les d clarations e

9.1 D clarations de d nition et de r f rence . . . . . . . . . e e ee 9.1.1 D clarations de variables . . . . . . . . . . . . . e 9.1.2 D clarations de fonctions . . . . . . . . . . . . . e 9.1.3 D clarations d' tiquettes de structures et union . e e 9.2 Port e des d clarations . . . . . . . . . . . . . . . . . . . e e 9.3 Visibilit des identi cateurs . . . . . . . . . . . . . . . . e 9.4 Les espaces de noms . . . . . . . . . . . . . . . . . . . . 9.4.1 Position du probl

me . . . . . . . . . . . . . . . . e 9.4.2 Les espaces de noms du langage C . . . . . . . . 9.5 Dur e de vie . . . . . . . . . . . . . . . . . . . . . . . . . e 9.6 Classes de m moire . . . . . . . . . . . . . . . . . . . . . e 9.6.1 Position du probl

me . . . . . . . . . . . . . . . . e 9.6.2 Les sp ci cateurs de classe de m moire . . . . . . e e 9.7 La compilation s par e . . . . . . . . . . . . . . . . . . . e e 9.7.1 G n ralit s . . . . . . . . . . . . . . . . . . . . . ee e 9.7.2 La m thode du langage C . . . . . . . . . . . . . e 9.8 D nition de types . . . . . . . . . . . . . . . . . . . . . e 9.9 Utilit des typedef . . . . . . . . . . . . . . . . . . . . . e 9.9.1 Restriction d'un type de base . . . . . . . . . . . 9.9.2 D nition de type structure . . . . . . . . . . . . e 9.9.3 D nition de types opaques . . . . . . . . . . . . e 9.10 Quali catifs de type . . . . . . . . . . . . . . . . . . . . 9.11 Fonction a nombre variable de param

.tres . . . . . . . .

. . . . . Diagnostic . . . . . . . . . . 9. . . . . . . . . . . . . e e 9. . . . . . . . . . . . . . . . . . . . . . .16 Un outil : cdecl . . . . . . .11. . . . . . . . . . . .14 Discussion sur les d clarations . 9. . . e 9. . .13 S mantique des d clarations . . . . . . . . . . . . . . . .1 Exemple 1 . . . . . . . . . . . . . . . . . . . . . . . Manipulation de caract. . . . . . . . . . . . . . . e 9. .15 En pratique . . . . . . .2 Exemple 2 . . . . . . . . . .11. . . . . . . e 9. . .12 Syntaxe des d clarations . . . . . . . . . . 9. . . . .

2 Fonctions exponentielles et logarithmiques .4. .3 Fonctions diverses . .h . . . . . .4. e 10. . Math matiques math. . . . . . . . . . . . Nombre variable de param. . . . .h . . . . Branchements non locaux setjmp. . . . . . . . e 10.h . . 10. . Manipulation des signaux signal. . . . .res ctype. . .4. . .h . . . . . . e Environnement local locale. . .h . . . . . . . . . .1 Fonctions trigonom triques et hyperboliques . .

. .h . e 10. e 10. . . .1 Op rations sur les chiers .h . . . . e Entr es sorties stdio. .8. . . . . .8. . . . .tres stdarg. . . . . . . . .2 Acc. . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 . . . . . . 167 . . 154 . . . . . . . . . . . . . . . . 163 . . . . . . . . . . . . . . . . . . 149 . . 161 . . . . . . . 167 . . . . . . 157 . . . . . . . . . . . . . . . . . . 167 . . . . . . . . 146 . 143 . . . 146 . . e 10. . . . . 166 . . 166 . 147 . . . 158 . . . . . . . . . . . . . . . . . . . . . . . . . . 145 . . 166 . . . . . . 167 . . . . 155 . . . . . . . . . . . . . . . 166 . . . . . . . . . . . . . . . . . . . . . . . . . . .s aux chiers .3 Entr es-sorties formatt es . . 144 . . . . . . . . . . . . . 162 . . . .8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e viii . . . . . . . . . 144 . . . . . . . . . . 151 . . . . . . 151 . . . . . . 156 . . . . . . . . . . . . . . . . . . . . . . . 144 . . . . . . . 166 . . . 163 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 143 10 La biblioth. . . . . . . . 153 . . . . . . . . . . . . . . 154 . . . . . . . . 153 . . . . . . . . . . . . . . 146 . . . . . . . . . . . . . 157 . . . . . . . . . . . . . . . 166 . . 165 . . . . . . . . . . . . . . 149 . . . 148 . . . . . . . 165 . 152 . . . 155 . . .

8 .4 165 10.3 10.2 10.6 10.1 10.5 10.que standard e 10.7 10.

4 Entr es-sorties caract.10.8.

. e 10. .9. . . .6 Arithm tique sur les entiers . . .9. . .9. . . . 10. . .9 Utilitaires divers stdlib. . . .8.5 Recherche et tri . . e 10.7 Gestion des caract. . . . . . e e 10.4 Communication avec l'environnement . . . . . . . .h . . . .9.6 Position dans un chier .7 Gestion des erreurs . . . . . .3 gestion de la m moire .res . . . .9. e 10. . . . . . . . .8. . .8. . . . . . .2 G n ration de nombres pseudo-al atoires ee e 10. . . . . . .9. . . 10. . 10. . . 10.5 Entr es-sorties binaires . 10. . . . . . . . .9. . . . . . .1 Conversion de nombres . . . . . 10. . . .

. . . . 169 . . . . . . 175 . . . . . . . . . . . . 169 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 . . . . . 169 . . . . . . . . . . . . 169 . . . . . . . . . . . . . . 176 . . .10Manipulation de cha^nes string. . . . . 10. . . . . 168 . . . . . . . . . . . 168 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 . . . . . . . 175 . 168 . . . . . . . 172 .h . . . . . . . . . . 177 A Les jeux de caract. . . 170 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11Manipulation de la date et de l'heure time. . . . . . . . . . . . 169 . . . . . . . . . . . . . . . .res multi-octets . . . . . . . . . . . . . .h . . . . . . . 171 . . . . . 168 . . 169 . . . . . . . . . . . . . e 10. . 169 . . . . . .

. . . . D. . . . . . .1 Les unit s lexicales . . . . . . e D. . . . .2. 187 . . . . . . . . . . . . . . . . . . . 188 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 . . . . . . . . . . . . . 187 . . . . . . . . . . . e D. .res e A. . . .11 Les d clarations . . . . . . . e D.2 Les mots-cl s . . . . . . . . . . . . . . . . . . . 184 . . . . . . . . . . .5 Les cha^nes litt rales . . A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 181 . . . . . . . . . . . . . . . . . . . . . . .10 Les expressions . D. .2. 186 . . . . . . . . . . . .9 Les nombres du pr processeur . . . . . . . . . . . . . . . . . . . . . 183 . . . . . 184 . . . . . . . . . . . . . . .12 Les instructions . . . . . . . .2 Les codes ascii en hexad cimal e A. . . . . e D. . . . . . .2. 194 . . A. . 183 . . . . . . . . . . . . . . . . . . . . . . . . . .14 Directives du pr processeur . . . . . . .1 Les codes ascii en octal . . . . . . 171 B Bibliographie C Ressources Internet D La grammaire D. . . . . D. . . e D. . . . . .6 Les op rateurs . D. . . . . . . . .8 Nom de chier d'inclusion . D. . .13 D nitions externes . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Les constantes . . . e D. . . 187 . . . . . . . . . . . . . . . . . . . . . . . 194 . . . . .1 Les normes . . . . A. . . . . . . . 193 . . . . . . . . . . . . . . . . . . . . . . .3 Les identi cateurs .3 Les codes ascii en d cimal . . .7 La ponctuation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 183 . .3 Les codes ISO-Latin-1 . . e D. . . .2 Le code ascii . . . . e A. . . . . . . . . . . D. . . .15 R f rences crois es de la grammaire ee e ix . . . . . . . e D. . . . . . . . . . . .

3 Erreur sur macro avec param. . . . . . 209 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . 205 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les num rations . . . . . . Les pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 . .1. . . . 208 . . . . . . . . . . . . . . . 206 . . . . . 203 . 206 . . . . . . . . . . . . . . . . . . . . .4 E. . . unions et champs de bits Les quali catifs . . . . . . . . . . . .3 E. . . . . . . . . . . . 206 . Les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . .1 Un define n'est pas une d claration . . . . . . . . . .1 Erreur sur une comparaison . 208 .5 E. . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . .2. . . 208 . . .1 E. . . . . Les tableaux .7 Les types de base . . . . . . . . . e F.6 E. 206 . . . . . . . . . 202 . . . . . . . . . . . . F. . . . . . . . . . . . . . . . . . . . . . .1 Erreur avec les op rateurs . . . . . . 199 . . . . . . . . . . . . 208 . . . 205 . . . . . . . 200 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F. e F. . . . . . . . . . . . . . . . . . .2 Erreur sur l'a ectation . . . e e Les structures. 202 . . . . . .2 Erreurs avec les macros . . . . . . . .2 Un define n'est pas une initialisation F. .2. . . . . 209 199 F Le b^tisier e F.E Un bestiaire de types E. 201 . . . . . . . . . . . . . . 205 .2 E. . . . . . . . . . . . . . . . . . . . . . . . . . 207 . . 207 . . . . . . . . . . . . F. . . . . . . . . . . . . . . . . .

. . e e 205 x . . . .tres . . . e e F.4 Erreurs avec les commentaires . . F. . . . . . . . . e F. . . . . .2 Erreur sur le default . .2. . . . . . . . .4 Erreur avec les e ets de bord . .5 Erreurs avec les priorit s des op rateurs . F. F. . . . . . . . .6 Erreur avec l'instruction switch . . . . . . . . .1 Oubli du break . . .6. . . . . . . .8 Erreur avec la compilation s par e . . . . F.7 Erreur sur les tableaux multidimensionnels . . . . . F. F.3 Erreurs avec l'instruction if .6. . F. .

imag.Avant-propos Au sujet de l'auteur Je suis ing nieur au cnrs et je travaille dans un laboratoire de recherche de l'univere sit de Grenoble : le laboratoire clips http: www-clips. Toute noti cation e d'erreur ou toute proposition d'am lioration de ce document sera la bienvenue .fr.

fr. Au sujet de ce manuel La litt rature technique nous a habitu . l'e-mail e a Bernard.Cassagne@imag.

Les guides de l'utilisateur se donnent e comme but d'^tre didactiques. Cette partition vient du fait qu'il est quasiment impossible e sur des sujets complexes comme les langages de programmation d'^tre . deux styles d' criture de manuels : le style e ea e manuel de r f rence  et le style  guide de l'utilisateur  Les manuels de r f rence se ee ee donnent comme buts d'^tre exhaustifs et rigoureux.

Ce manuel se place dans la cat gorie  guide de l'utilisateur  : son but est de permettre e a . la fois rigoureux e a et didactique. Pour s'en persuader il su t de lire le texte d'une norme internationale.

e ee Ce manuel pr sente donc chaque notion selon une gradation des di cult s et ne cherche e e pas . une personne sachant programmer. d'acqu rir les l ments fondamentaux du langage C.

^tre exhaustif. mais commence toujours sur une page di rente. e Le lecteur peut donc au choix. ainsi que des exercices dont la ae solution se trouve dans le corps du texte. Il comporte de nombreux exemples. ne lire les solutions qu'apr.

En cas de rencontre d'un mot inconnu.s avoir programm sa solution e e personnelle.   Les notions suppos es connues du lecteur e Les notions suppos es connues du lecteur sont les concepts g n raux concernant les lane ee gages de programmation. e. ou bien lire directement la solution comme si elle faisait partie du manuel. ee le lecteur est invit a s'y reporter. En n du texte se trouve un glossaire qui regroupe des concepts g n raux et certains concepts propres du langage C.

Un mot sur les probl.

C'est un document crit en anglais technique.mes de traduction e Le document de r f rence concernant le langage C est la norme ansi d nissant le ee e langage. ce qui pose des probl.

mes de e e traduction : comment traduire les n ologismes invent s pour les besoins du langage? De e e mani.

re .

ne pas d router les lecteurs franais. je me suis impos de respecter les choix de e a e c e 1 .

m^me quand je n'ai pas trouv ces e e e choix tr.traduction d'un grand diteur 1 de livres techniques.

s heureux. J'ai donc utilis d clarateur. a Conventions syntaxiques Les r. initialisateur et sp ci cateur bien que me e e e e semble-t-il. ils r^pent assez fort le palais quand on les prononce.

Cependant.gles de grammaires qui sont donn es dans le corps de ce manuel sont simpli es e e e dans un but didactique par rapport a la grammaire o cielle du langage. le .

lecteur trouvera .

l'annexe D la grammaire sous une forme exhaustive et conforme .

la a a norme ansi. La typographie des r.

les l ments terminaux du langage seront crits dans une fonte .gles suit les conventions suivantes : e 1.

les l ments non terminaux du langage seront crits en italique. 3. comme ceci : ee e instruction. largeur constante. ee e a comme ceci : while. les r. 2.

gles de grammaires seront crites de la mani.

re suivante : e e e les parties gauches de r.

cadr es .gles seront seules sur leur ligne.

les di rentes parties droites possibles seront introduites par le signe  et e indent es sur la droite. e Exemple : instruction :   if if   expression expression   instruction 1 instruction 1 else instruction 2 Ceci signi e qu'il y a deux mani. gauche et e e a suivies du signe deux points :.

res possibles de d river le non-terminal inse e truction. La premi.

re r.

gle indique qu'on peut le d river en : e e e if  expression  instruction 1 la deuxi.

me r.

gle indique qu'on peut aussi le d river en : e e e if  expression  instruction 1 else instruction 2 une partie droite de r.

gle pourra ^tre crite sur plusieurs lignes. Ceci permettra e e e de r ter une mani.

c . de faon a obtenir une bonne lisibilit .re possible de mettre en page le fragment de programme ee e C correspondant.

l'exemple pr c dent aurait pu ^tre crit : ee e e instruction :  expression instruction 1  if  expression instruction 1 else instruction 2 if    1. C'est masson qui a dit en franais 1 et 2 Cf. Bibliographie e e c 2 . e Sans en changer la signi cation.

les l ments optionnels d'une r.

.gle seront indiqu s en mettant le mot  option  ee e e en italique et dans une fonte plus petite a droite de l' l ment concern .

la r. ee e Par exemple.

gle : e d clarateur-init : e  d clarateur initialisateur option e indique que d clarateur-init peut se d river soit en : e e d clarateur initialisateur e soit en : d clarateur e Remerciements Beaucoup de personnes m'ont aid .

am liorer le manuscrit original en me signalant ea e de nombreuses erreurs et en me proposant des am liorations. Qu'elles soient toutes remere ci es de leurs lectures attentives et amicalement critiques. tout particuli.

3 .rement Damien e e Genthial. Fabienne Lagnier. Xavier Nicollin et Serge Rouveyrol.

4 .

Arriv au bout du chapitre.Chapitre 1 Les bases Le but de ce chapitre est de pr senter les l ments de base du langage C. le lecteur sera capable d' crire des programmes e e l mentaires. Il a e e t d ni une premi. sous leur forme e ee la plus simple.1 Les versions du langage C Le langage C a subi au cours de son histoire deux grandes tapes de d nition. ee 1.

B. Cette e e version est appel e  Kernighan et Ritchie 78 . ee e e Ritchie. ou K&R 78 en abr g .re fois par deux chercheurs des Laboratoires Bell. Kernighan et D. publi en 1978. simplement K&R. Suite . dans un livre intitul  The C Programming Language . ou encore le plus e ee souvent.

l'extraordinaire succ.

s d'unix. qui induisit le succ.

s du langage C. la situation a e e devint confuse : plusieurs fournisseurs de compilateurs mirent sur le march des compie lateurs non conformes .

K&R car comportant des extensions particuli.

res. A la n des a e .

ann es 80. t^che . il devint n cessaire de mettre de l'ordre dans ce chaos et donc de normaliser e e le langage.

organisme de normalisation am ricain. En 1990. adopta tel quel le standard ansi en tant que standard iso. l'iso 2 . La a a e norme ansi fut termin e en 1989. donc chapeautant l'ansi. laquelle s'attela l'ansi 1. Cette seconde version du langage C devrait donc s'appeler iso c. mais comme les acteurs importants du monde informatique sont de culture anglo-saxonne et que ceux-ci persistent . organisme de normalisation internae tional.

a e nous suivrons l'usage g n ral. presque? tout le monde fait de m^me. et utiliserons l'expression ansi c pour d signer la norme ee e commune a l'ansi et l'iso. l'appeler ansi c. Dans ce manuel. .

avec parfois des r f rences . Ce document d crit C ansi.

de mani. C K&R.

re .

pere ee a e a mettre au lecteur de comprendre les sources crits avant l'apparition de la norme.2 Langage et biblioth. e 1.

que standard e Le langage C a t conu pour l' criture de syst.

en particulier le syst.mes.

American National Standards Institute 2. ee c e e e Pour cette raison.me unix. International Standards Organization 5 . ses concepteurs ont fait une s paration nette entre ce qui est purement e 1.

algorithmique d clarations. et tout ce qui est interaction avec le syse t. etc. instructions.

etc. qui est r alis par appel de fonctions e e e e e se trouvant dans une biblioth. allocation de m moire.me entr es sorties.

que dite biblioth.

Cette coupure se retrouve e e dans la norme qui est compos e essentiellement de deux grands chapitres. les chapitres e  langage  et  biblioth.que standard.

   e  Ce manuel se donne comme objectif de donner une vue d'ensemble du langage.que  . mais pas de la biblioth.

De la biblioth.que standard.

que standard ne seront pr sent es de mani.

re e e e e e compl.

te que les fonctions permettant de r aliser les entr es-sorties et la gestion m moire. la liste exhaustive des noms des fonctions de la biblioth. e e e e Cependant.

pour rendre e e des services du type inclusion de source.4 Les jeux de caract. un pr processeur r alise des transformations d'ordre purement textuel.que. le compilateur proprement dit prend le texte g n r par le pr processeur et le traduit e ee e en instructions machine. et traitement de macros . est donn e dans le chapitre 10. e 1. e 1. La fonction de pr processeur est assez souvent impl ment e par un programme s par e e e e e cpp sous unix qui est automatiquement appel par le compilateur. 2. class s par type e e d'utilisation.3 Les phases de compilation Les compilateurs C font subir deux transformations aux programmes : 1. compilation conditionnelle.

res e Le lecteur non familiaris avec les probl.

mes de codage de caract.

res peut se reporter e e e a .

l'annexe A. o.

ces probl.

mes sont d velopp s. u e e e Le langage C n'impose pas un jeu de caract.

op rateurs. etc. est d ni en utilisant les caract.res particulier. Par contre tout le langage e mots-cl s.

res ascii. M^me les identi e e e e e cateurs doivent ^tre crits avec l'alphabet anglais. Par contre. le jeu de caract.

res utilis e e e e pour les constantes caract.

re. les cha^nes de caract.

res et les commentaires est d pendant e e e de l'impl mentation. e Pendant tr.

pour programmer en C. Actuellement. il ne doit pas y avoir de probl. si on est dans le monde unix.s longtemps les programmeurs non anglophones ont utilis l'ascii faute de e e mieux.

le shell.me pour disposer d'un environnement de travail la fen^tre. le compilateur enti. e e l' diteur.

rement .

5 Les unit s lexicales e Le langage comprends 6 types d'unit s lexicales : les mots-cl s. les identi cateurs. Dans ce manuel. e e 1. les cha^nes. les e e constantes. la norme iso-8859. les op rateurs et les signes de ponctuation. on suppose e e a que le lecteur dispose d'un tel environnement : les exemples donn s sont crits en iso-8859. e 6 .

5.1.1 Les mots-cl s e Le langage C est un langage .

ce qui signi e qu'un certain nombre de a e mots sont r serv s pour le langage lui-m^me et ne peuvent donc pas ^tre utilis s comme e e e e e identi cateurs. Si le lecteur d sire ^tre convaincu. il lui est sugg r e e e ee de donner le nom long . La liste exhaustive des mots-cl s est la suivante : e auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Attention Si le compilateur produit un message d'erreur syntaxique incompr hensible il est ree command d'avoir le r exe de consulter la liste des mots cl s pour v ri er que l'on a pas e e e e pris comme identi cateur un mot-cl . mots-cl s.

une variable enti.

a e Le but d'un identi cateur est de donner un nom a une entit du programme variable. .re.

etc. e proc dure. Les identi cateurs sont form s d'une suite de lettres. suite dont le premier caract. de chi res et du signe e e soulign .

_deb sont des identi cateurs valides. Les lettres formant e e e les identi cateurs peuvent ^tre majuscules ou minuscules. Un compilateur a le droit de tronquer les identi cateurs internes ceux qui ne sont pas export s . mais 1i et i:j ne le sont pas. mais doivent faire partie de e l'alphabet anglais : les lettres accentu es sont interdites.re ne peut pas ^tre un chi re. e i_tab. Les noms var1. PremierIndex.

un diteur de liens au del.

d'une certaine longueur. Cette limite d pend de e a e a e l'impl mentation. mais ne doit pas ^tre inf rieure a 31 caract.

e e e .res.

e De la m^me mani.

re. les identi cateurs externes export s a un diteur de liens poure e e .

e ront ^tre tronqu s au del.

Cette limite est g n ralement plus e e a ee s v. d'une certaine longueur.

mais ne peut ^tre inf rieure a 6 caract.re.

la distinction entre minusee e e .res. De surcro^t.

ou un commentaire les commentaires ne peuvent donc pas ^tre e e imbriqu s.5. 1. e 7 .2 Les identi cateurs 1. Exemple : * Ceci est un commentaire Toute occurrence de * est interpr t e comme le d but d'un commentaire sauf dans ee e une cha^ne litt rale. pour lesquels cette distinction est garantie.6 Les commentaires Syntaxe : Les commentaires d butent par e * * et se terminent par * . e cules et majuscules n'est pas garantie au contraire des noms internes.

il est ee admis qu'il faille commenter selon les niveaux suivants : unit de compilation : pour indiquer le nom de l'auteur. les droits de copyright. pas seulement le langage C.Recommandations : Dans le domaine g n ral de la programmation. ainsi que e e la raison d'^tre de l'unit . e e proc dure : pour indiquer les param. e la date de cr ation. les dates et auteurs des di rentes modi cations.

8 1993 02 05 19:39:30 lwall Revision 4. $Log: perl.0. Larry Wall You may distribute under the terms of either the GNU General Public License or the Artistic License.2 91 06 07 11:26:16 lwall Revision 4.0. e Pour le niveau unit de compilation.1.0 baseline.c. voici un exemple tir du source de perl : e e * * * * * * * * * * * * * * * * Copyright c 1991.0 91 03 20 01:37:44 lwall 4.tres et la raison d'^tre de la proc dure .1.1.1.3 91 06 07 11:40:18 lwall Revision 4. Pour le niveau de la proc dure.1.7 92 06 08 14:50:39 lwall Revision 4. e d claration ou instruction : le plus bas niveau de commentaire.1 91 04 11 17:49:05 lwall Revision 4.0. as specified in the README file. je trouve agr able de r aliser des esp.0. e e e e groupe d'intructions : pour exprimer ce que r alise une fraction signi cative e d'une proc dure .v $ Revision 4.0.

e e e comme ceci par exemple : ****************************************************************************** * * * strcpy * * * * But: * * copie une cha^ne dans une autre * * * * Interface: * * s1 : cha^ne destination * * s2 : cha^ne source * * * ****************************************************************************** En ce qui concerne le niveau groupe d'instruction. il est classique de faire une mise en page comme dans l'exemple suivant tir du source de dvips 3 : e * 3.ces de care e e e touches permettant de d couper visuellement un listing en ses di rentes proc dures. dvips est un traducteur en PostScript du format g n r par TeX e ee 8 .

on commentera sur la m^me ligne. * Next function unit.* * * * * * * * If nothing above worked. Dans e ce cas. We much prefer scaling up to scaling down. int multiplicity. struct function_unit *next. and then use PostScript scaling to generate the correct size. struct range ready_cost. Exemple e e tir du source du compilateur gnu cc : e char *name. * Range of ready cost values. and then work down. so we try the larger sizes first. We attempt to open the stupid font at one of a small set of predefined sizes. * * * * Function unit name. Pour le niveau d claration ou instruction. since scaling down can omit character features. * Number of units of this type. * Maximum number of simultaneous insns on this function unit or 0 if unlimited. struct range issue_delay. int simultaneity. * * Attention L'erreur classique avec les commentaires est d'oublier la s quence fermante * . then we get desperate. le compilateur va consid rer que le commentaire se poursuit jusqu'. * * Range of issue delay values.

ee Exemple : instruction instruction . tout un ensemble d'instructions sera ignor par le compilae 4. instruction * * premier commentaire instruction On voit que dans ce cas.. il n'est donc pas possible de mettre en commentaire un morceau de programme comportant d j. la n du e a prochain commentaire et ceci peut ne pas g n rer d'erreur syntaxique. teur sans g n rer le moindre message d'erreur ee second commentaire * Un commentaire ne peut pas contenir un commentaire..

l'e cacit e de l'algorithme de hachage de la table des identi cateurs d pendait de la bonne initialisation d'une variable. e Dans le code initial. l'initialisation avait t mise involontairement dans un commentaire provoquant une ee initialisation par d faut . des commenea 5. taires 4. Peter Van der Linden donne un exemple amusant de ce bug. Dans un compilateur. Dans 5 .

Voir cependant F. La simple correction du bug.4 9 . z ro. t gagner 15 d'e cacit au compilateur ! e a e e 5.

1 Les caract.1.7.7 Les types de base 1.

res e Le mot-cl d signant les caract.

Un objet de ce type doit pouvoir contenir e e e le code de n'importe quel caract.res est char.

re de l'ensemble des caract.

res utilis sur la machine. e e e Le codage des caract.

Attention Le type caract.res n'est pas d ni par le langage : c'est un choix d'impl mentation. e e e Cependant. ou un e e surensemble comme par exemple la norme iso-8859. dans la grande majorit des cas. le code utilis est le code dit ascii.

re est original par rapport .

ce qui se fait habituellement dans les e a langages de programmation. La norme pr cise clairement qu'un objet de type caract.

re e e peut ^tre utilis dans toute expression o.

si c est de type char. un objet de type entier peut ^tre utilis . Par e e u e e exemple. il est valide d' crire c + 1 : cela donnera le caract.

7. tr. Les impl mentations classiques mettent les e short int sur 16 bits. int et long int. sinon comme des int. on peut e e avoir trois types d'entiers : short int. Les int permettent de contenir des entiers sign s.2 Les entiers Le mot cl d signant les entiers est int. sinon comme des int. Du point de vue de la repr sentation. on e e peut avoir deux types d'entiers : int et unsigned int. Du point de vue de la pr cision. Les long int sont impl ment s si possible plus e e grands que les int. e e Les attributs de pr cision sont short et long.re e e suivant dans le code utilis sur la machine. L'attribut de repr sentation est unsigned. les long int sur 32 bits. Les entiers peuvent ^tre a ect s de deux types e e e e d'attributs : un attribut de pr cision et un attribut de repr sentation. Les int sont impl ment s sur ce e e qui est un mot  naturel  de la machine. Les short int sont impl ment s si possible e e plus courts que les int. et les int sur 16 ou 32 bits selon ce qui est le plus e cace. e 1.

s g n ralement en repr sentation en compl ment .

long int tous trois sign s et unsigned int.3 Les ottants Il existe trois types de ottants correspondants . 2. Les unsigned int permettent de contenir des entiers e non sign s en repr sentation binaire. bien que cela e e ee e e a ne soit pas impos par le langage. En r sum .7. on dispose donc de six types d'entiers : e e int. unsigned short int e et unsigned long int. 1. short int. e e On peut combiner attribut de pr cision et attribut de repr sentation et avoir par e e exemple un unsigned long int.

En allant a e de la pr cision la plus faible vers la plus forte. on dispose des types float. e 10 . La pr cision e ectivement utilis e pour chacun de ces types d pend de e e e l'impl mentation. double et e long double. trois pr cisions possibles.

8 Les constantes 1.1 Les constantes enti.1.8.

res e Syntaxe : On dispose de 3 notations pour les constantes enti.

octale et hexad e e e cimale. Les constantes d cimales s' crivent de la mani.res : d cimale.

re usuelle ex : 372. Les constantes e e e octales doivent commencer par un z ro et ne comporter que des chi res octaux e ex : 0477. ainsi que des lettres de a . Les constantes hexad cimales doivent commencer par 0x ou 0X et ^tre e e compos es des chi res de 0 a 9.

f sous leur forme majuscule e .

Une constante enti. 0X5a2b. a ou minuscule ex : 0x5a2b. 0x5A2B.

Elle peut galement ^tre su x e par e ee e e e e e la lettre l ou L pour lui donner l'attribut de pr cision long. e S mantique : e Le type d'une constante enti.re peut ^tre su x e par la lettre u ou U pour indiquer qu'elle e e e doit ^tre interpr t e comme tant non sign e.

octal ou hexad cimal int. long int. unsigned long int su x par u ou U et l ou L e unsigned long int long int Attention Ces conventions d' criture des constantes ne respectent pas l' criture math matique. choisi dans une liste de types.re est le premier type. unsigned int. long int. unsigned long int pas de su xe. e e e puisque 010 devant ^tre interpr t en octal. d cimal e int. unsigned long int su x par l ou L e long int. e permettant de repr senter la constante : e liste de types forme de la constante pas de su xe. unsigned e su x par u ou U e unsigned int. n'est pas gal .

10. e ee e a 1.2 Les constantes caract.8.

res e Syntaxe : Une constante caract.

La r.re s' crit entour e du signe '.

gle g n rale consiste .

crire e e e e ee ae le caract.

par exemple.re entour du signe ' . la constante caract.

re correspondant e e e au caract.

re g s' crit 'g'. e e 11 .

Les cas particuliers Les cas particuliers sont trait s par une s quence d' chappement introduite par le e e e caract.

e Caract.re .

e e 1.res ne disposant pas de repr sentation imprimable. On peut les d signer par la notation ' nb' o.

nb est le code en octal du e u caract.

Exemple : e e constante caract.re.

re s mantique e ' 0' null ' 12' newline ' 15' carriage return ' 33' escape 2. On peut les d signer par la notation ' xnb' o.

nb est le code en hexad e u e cimal du caract.

re. Exemple : e constante caract.

utilis s tr.re s mantique e e ' x0A' newline ' x0D' return ' x1B' escape 3. Certains d'entre eux.

disposent d'une notation e e e particuli.s fr quemment.

re. Il s'agit des caract.

res suivants : e e s mantique e constante caract.

re e ' n' new line ' t' horizontal tabulation ' v' vertical tabulation ' b' back space ' r' carriage return ' f' form feed ' a' audible alert Caract.

res disposant d'une repr sentation imprimable mais devant ^tre d sign s e e e e e par une s quence d' chappement. e e constante caract

re s mantique e e
' '' ' ' '

Caract

res disposant d'une repr sentation imprimable et pouvant ^tre d sign s e e e e e soit par une s quence d' chappement soit par eux-m^mes. e e e constante caract

re s mantique e e ' "' ou '"' " ' ?' ou '?' ? S mantique : e Une constante caract

re est de type int et a pour valeur le code du caract.

re dans e e le codage utilis par la machine. e 12 .

Note Pourquoi diable les deux caract.

res " et ? disposent ils de deux notations possibles? e Le caract.

re " peut ^tre repr sent par la notation ' "' parce que celle-ci doit e e e e ^tre utilis e dans les cha^nes de caract.

les concepteurs du langage n'ont pas voulu qu'une notation valable pour e une cha^nes de caract. Pour des raisons de e e e sym trie.9.res voir plus loin 1.

res ne soit pas valable pour un caract.

re. e e Le caract.

re ? est un cas .

part .

Les trie a a graphes sont des s quences de trois caract. cause de l'existence des trigraphes.

res permettant de d signer les caract.

res e e e e  ^ | ~. les terminaux conformes . En e et.

la norme iso 646:1983 ont a remplac ces caract.

res par des caract.

e e e c connaissent bien le probl. par exemple. Les franais.res nationaux.

me des et des qui se transforment en et .

3 Les constantes ottantes Syntaxe : La notation utilis e est la notation classique par mantisse et exposant. La mantisse e est compos e d'une partie enti.8. e e e La norme ansi a d ni les 9 trigraphes suivants : e e trigraphe s mantique ??= ?? ?? ?? ??' ?? ?? ??! ?? ^ | ~ 1..

re suivie du signe . La partie enti. point suivi de la partie frace e tionnaire.

la valeur est arrondie vers une e valeur sup rieure ou inf rieure le choix d pend de l'impl mentation. e e e Une constante ottante peut ^tre su x e par l'une quelconque des lettres f. e e S mantique : e Une constante non su x e a le type double. e e e e 13 .re et la partie fractionnaire sont exprim es en d cimal et e e e l'une ou l'autre peuvent ^tre omises. L'exposant est un nombre d cimal ventuellement sign . L. Une constante su x e par l ou L a le type long double. Si la valeur r sultante ne correspond pas au type. Une constante su x e par f ou F a le e e type float. e La valeur de la constante mantisse e exposant est mantisse 10exposant . F. l. e L'exposant est introduit par la lettre e sous la forme minuscule ou majuscule.

9 Les cha^nes de caract.3e4 2 3  104 2.Exemples : notation C notation math matique e 2. 2 .3e-4 2 3  10.4 : : : : : 1.3 23 2e4 2  104 2.3e4 2.3 03 2.e4 2  104 0 3  104 .

res litt rales e e Une cha^ne de caract.

res litt rale est une suite de caract.

8. e e e e Exemple : "ceci est une cha^ne" Toutes les s quences d' chappement d nies en 1.2 sont utilisables dans les cha^nes. e e e Exemple : "ligne 1 nligne 2 nligne 3" Le caract.res entour s du signe ".

re suivi d'un passage .

Cela permet de faire e a e tenir les longues cha^nes sur plusieurs lignes de source. la ligne suivante est ignor . Exemple : "ceci est une tr.

s tr.

le compilateur concat.s longue cha^ne que l'on fait tenir e e sur deux lignes de source" Si deux cha^nes litt rales sont adjacentes dans le source.

Exemple : "Hello " "World!!" est quivalent .ne les e e deux cha^nes.

e a Le compilateur rajoute a la n de chaque cha^ne un caract. "Hello World!!".

Le caract.re mis a z ro.

re .

e .

Cette convention de n de e e cha^ne est utilis e par les fonctions de la biblioth. e e dont la valeur est z ro est appel null dans le code ASCII.

que standard. Exemple : sur rencontre e e de "Hello!" le compilateur implantera en m moire 7 caract.

e. o. !. l. e e Dans une cha^ne de caract. l.res H. 0.

res litt rale. le caract.

re " doit ^tre d sign par la s quence e e e e e e e d' chappement. alors que ' peut ^tre d sign par sa s quence d' chappement ou par luie e e e e e m^me.10 Les constantes nomm es e Il y a deux faons de donner un nom a une constante : soit en utilisant les possibilit s c . e 1.

e e e 14 . e du pr processeur. soit en utilisant des num rations.

10.14159 3. . Il n'y a donc pas de . toute nouvelle occurrence de identi cateur par reste-de-la-ligne. Par exemple on peut crire : e define PI 3.1 Les de ne define Lorsque le pr processeur lit une ligne du type : e identi cateur reste-de-la-ligne il remplace dans toute la suite du source.14159.1. et dans la suite du programme on pourra utiliser le nom PI pour d signer la constante e Attention Une telle d nition de constante n'est pas une d claration mais une commande du e e pr processeur.

et par exemple. remplae cera l'expression PI 2 par 3. Si on crit : e define PI 3. 2 ce qui est une expression incorrecte. le pr processeur remplacera toute utilisation de PI par 3. il fait des transformations d'ordre purement textuel. ce qui g^nera la d tection e e de l'erreur.10. le message d'erreur ne sera pas mis sur la ligne fautive le define.14159. Rappelons que le pr processeur ne compile e a e pas.2 Les num rations e e enum enum On peut d nir des constantes de la mani. mais e sur une ligne correcte celle qui contient l'expression PI 2. la n.14159. 1. Dans une telle situation.14159.

MERCREDI. 6..re suivante : e e liste-d'identi cateurs Par exemple : LUNDI. . 1.. SAMEDI... Si on d sire donner des valeurs particuli. et e e leur donne les valeurs 0. . DIMANCHE . MARDI. JEUDI. VENDREDI. DIMANCHE comme tant des constantes de type int. d nit les identi cateurs LUNDI.

res aux constantes. Il n'est pas n cessaire de donner une valeur . ESPAGNE = 20. ITALIE = 30 . e e cela est possible : enum FRANCE = 10.

LUXEMBOURG. toutes les constantes : e a enum FRANCE = 10. donnera la valeur 11 . BELGIQUE. ITALIE = 30 . ESPAGNE = 20.

a . LUXEMBOURG et 12 a BELGIQUE.

Il est d'usage au moins dans le monde unix de donner un nom enti.

rement en majuse cules aux constantes nomm es d'un programme. qui accro^t la lisibilit des programmes. e 15 Remarque . Mon opinion est que ceci est une bonne e convention.

d2.12. int i = 34. . j = 12. e expression Dans le jargon C.12 Les op rateurs les plus usuels e 1. e Exemple : int i.1. int i.j. float f. Exemple : e e int i = 54.11 D clarations de variables ayant un type de base e Une telle d claration se fait en faisant suivre un type par une liste de noms de variables. Une lvalue peut ^tre par exemple une variable simple. une lvalue est une expression qui doit d livrer une variable par e opposition a une constante. short int k. l'a ectation est un op rateur et non pas une instruction. double d1.1 L'a ectation Syntaxe : expression : En C. 1. * * * * * d claration e d claration e d claration e d claration e d claration e de de de de de la variable i de type int deux variables i et j de type int la variable k de type short int la variable f de type float deux variables d1 et d2 de type double * * * * * Il est possible de donner une valeur initiale aux variables ainsi d clar es.

e e Exemples d'a ectation : = i = 3 f = 3.4 i = j + 1  lvalue S mantique : e L'op rateur d'a ectation a deux e ets : e 1. mais pas une constante. Cette notion permet d'exprimer dans ee la grammaire l'impossibilit d' crire des choses du genre 1 = i qui n'ont pas de sens. e un l ment de tableau. il r alise un e et de bord consistant .

a ecter la valeur de expression .

valeur qui pourra ^tre utilis e dans une exe e e e pression englobant l'a ectation. e e 2. Exemple : i = j = k + 1 16 . la e a a variable d sign e par la lvalue . il d livre la valeur ainsi a ect e.

La valeur de k est a ect e .

j et cette valeur est le r sultat de l'expression j e a e on y ajoute 1 et le r sultat est a ect .

la valeur est ventuellement e . Conversions de type : Lorsque la valeur de l'expression est a ect e a la lvalue. i. e ea = k .

On peut par exemple a ecter une expression enti. e convertie dans le type de la lvalue.

re .

Si exe e e e pression 1 et expression 2 font des e ets de bords. et la valeur obtenue est la e e e e valeur de l'expression d'addition. l'addition r alis e. un ottant.2 L'addition Syntaxe : expression :  + expression  expression 1 + expression 2 S mantique : e Les deux expressions sont valu es. e a 1. Apr. on n'est donc pas assur de l'ordre e dans lequel ils se feront. La s mantique de + expression est celle de 0 + e expression. n'est pas d termin .12. L'ordre dans lequel les deux expressions sont valu es.

de mani.s valuation des expressions. il peut y avoir conversion de type de l'un des e e op randes.

re a permettre l'addition. On pourra par exemple faire la somme e e .

d'une expression d livrant un ottant et d'une expression d livrant un entier : l'entier e e sera converti en ottant et l'addition sera r alis e entre ottants.3 La soustraction Syntaxe : L'op rateur peut ^tre utilis de mani.12. e e 1.

expression 2 S mantique : e Les deux expressions sont valu es.expression.expression est celle de 0 e . Les m^mes remarques concernant l'ordre d' valuation des op randes ainsi que les e e e ventuelles conversions de type faites au sujet de l'addition s'appliquent .re unaire ou binaire : e e e e expression :  .expression  expression 1 . La s mantique de . et la valeur obtenue est e e e e la valeur de l'expression soustraction. la soustraction r alis e.

la souse a traction. 17 .

Les m^mes remarques concernant l'ordre d' valuation des op randes ainsi que les e e e ventuelles conversions de type faites au sujet de l'addition s'appliquent .1.4 La multiplication Syntaxe : expression :  expression 1 * expression 2 S mantique : e Les deux expressions sont valu es. et la valeur obtenue e e e e est la valeur de l'expression multiplicative.12. la multiplication r alis e.

12. 1. la multie a plication.5 La division Syntaxe : expression :  expression 1 expression 2 S mantique : e Contrairement .

le langage C ne dispose que d'une seule notation a pour d signer deux op rateurs di rents : le signe d signe . d'autres langages.

la fois la division enti.

Si expression 1 et expression 2 d livrent deux valeurs enti.re e e e e a e et la division entre ottants.

alors il s'agit d'une e e division enti.res.

Si l'une des deux expressions au moins d livre une valeur ottante. Dans le cas de la division enti. e e il s'agit d'une division entre ottants.re.

si les deux op randes sont positifs.re. mais si au moins un des deux op randes est n gatif. l'arrondi se e e fait vers z ro. la faon dont se e e e c fait l'arrondi d pend de l'impl mentation mais il est g n ralement fait vers z ro. e ee Les remarques concernant l'ordre d' valuation des op randes faites au sujet de l'ade e dition s'appliquent galement . e e ee e Exemple : 13 2 d livre la valeur 6 et -13 2 ou 13 -2 peuvent d livrer -6 ou e e -7 mais le r sultat sera g n ralement -6.

la division. Les remarques concernant les ventuelles e a e conversion de type faites au sujet de l'addition s'appliquent .

la division entre ota tants.6 L'op rateur modulo e Syntaxe : expression :  expression 1  expression 2 S mantique : e Les deux expressions sont valu es et doivent d livrer une valeur de type entier. 1.12. e e e on value le reste de la division enti.

18 .re de expression 1 par expression 2 et la valeur e e obtenue est la valeur de l'expression modulo.

Exemples : ee e 13  2 d livre 1 e -13  2 d livre g n ralement -1 e ee 13  -2 d livre g n ralement 1.Si au moins un des deux op randes est n gatif. le signe du reste d pend de l'impl e e e e mentation. e ee Les choix d'impl mentation faits pour les op rateurs division enti. mais il est g n ralement pris du m^me signe que le dividende.

en ce sens que l'expression : e e b * a b + a  b o.re et modulo e e e doivent ^tre coh rents.

12. a et b sont des entiers u doit avoir pour valeur a. 1.7 Les op rateurs de comparaison e Syntaxe : expression :  expression 1 op rateur expression 2 e o.

On remarquera que le type du r sultat est int. et sa valeur est ignor e.13 Les instructions les plus usuelles 1. il s'agira d'une expression e e d'a ectation.1 Instruction expression Syntaxe : instruction :  expression . et 0 sinon. S mantique : e L'expression est valu e.13. car le type bool en n'existe pas. op rateur peut ^tre l'un des symboles suivants : u e e op rateur e = = == != s mantique e strictement sup rieur e strictement inf rieur e sup rieur ou gal e e inf rieur ou gal e e gal e di rent e S mantique : e Les deux expressions sont valu es puis compar es. la valeur rendue est de type int e e e et vaut 1 si la condition est vraie. Exemple : i = j + 1. 19 . Dans la majorit des cas. Ceci n'a donc de sens que si l'exe e e pression r alise un e et de bord. e e 1.

Remarque D'apr.

cette instruction n'a aucune utilit . mais ceci ne faisant aucun e et de bord.13. 2.2 Instruction compos e e Syntaxe : instruction :  liste-de-d clarationsoption e liste-d'instructions S mantique : e Le but de l'instruction compos e est double. de grouper un ensemble d'instructions en lui donnant la forme syntaxique d'une seule instruction . e 1. on voit qu'il est parfaitement valide d' crire l'instruction e e i + 1.s la syntaxe. elle permet : e 1. de d clarer des variables qui ne seront accessible qu'.

e ee 2. PL 1. e Remarques sur la syntaxe il n'y a pas de s parateur dans liste-d'instructions les points virgules sont des tere minateurs pour les instructions qui sont des expressions . on ex cute instruction 1 .3 Instruction if Syntaxe : instruction :   if if   expression expression   instruction 1 instruction 1 else instruction 2 S mantique : e expression est valu e. les accolades jouent le r^le des mots cl s begin et end que l'on trouve dans certains o e langages Pascal.13. etc. l'int rieur de l'instruction e a e compos e structure classique de 'blocs'. Attention au fait que expression doit ^tre parenth s e .. La partie then de l'instruction n'est pas introduite par un mot cl : pas de e comme dans certains langages. e e e sinon on ex cute instruction 2 si elle existe. 1. 20 then . e Remarques sur la syntaxe 1. si la valeur rendue est non nulle.

si on crit : e if a b if c d u = v. Lorsqu'il y a ambigu t sur l'instruction if dont d pend une partie else. le else sera celui du if crire : e if a b d u = v. il faudrait if c else i = j. l'ambigu t e e e est lev e en faisant d pendre le else de l'instruction if la plus proche. Si on voulait qu'il en soit autrement. e e Par exemple. Etant donn que l'instruction if teste l' galit .3. c d. else i = j.

z ro de expression. Toute expression d livrant une valeur e e pouvant ^tre compar e . celle-ci n'est e e ea e pas n cessairement une expression de comparaison.

else max = b. else . e e a e Remarques sur la s mantique e Exemples d'instructions if if a if x .. * liste d'instructions * b max = a... * e quivalent . z ro est valide.... y * liste d'instructions * if a .

if a != 0 a * 1.14 Inclusion de source Nous avons d j.

vu que la premi.

Nous allons voir dans ce chapitre ses capacit s d'inclusion de e source. il est e e e e 21 . de compilation conditionnelle e et de traitement de macros. Lorsqu'on d veloppe un gros logiciel. il est g n ralement n cessaire de le d couper e ee e e en unit s de compilation de taille raisonnable. Une fois un tel d coupage r alis .re phase de compilation est le traitement r alis par ea e e e le pr processeur qui rend des services d'inclusion de source.

courant que plusieurs unit s aient certaines parties communes par exemple des d nitions e e de constantes .

l'aide de commandes define. a De faon a viter la r p tition de ces parties communes. le langage C o re une facilit c .

e ee e d'inclusion de source qui est r alis e a l'aide de la commande include du pr processeur. e e .

chier il remplace cette ligne par le contenu du chier nom-de. e Lorsque le pr processeur rencontre une ligne du type : e include " nom-de.chier " ou include nom-de.chier. La mani.

re dont se fait la recherche du chier .

inclure est d pendante de l'impl mene a e e tation. Dans le syst.

me unix. il est traditionnel de se conformer .

la r.

le chier est un chier syst.gle suivante : e a e si on utilise et .

me. il sera recherch dans un ou plue e sieurs r pertoires syst.

mes connus du compilateur. comme par exemple usr include. le chier . e e si on utilise ".

e 1.1 D nition d'une fonction e Syntaxe : d nition-de-fonction : e  type identi cateur  liste-de-d clarations-de-param.15. inclure est un chier utilisateur. il sera recherch dans a e l'espace de chiers de l'utilisateur. par exemple le r pertoire courant.15 Les proc dures et les fonctions e 1.

tres e e  liste-de-d clarations option e liste-d'instructions Dans le jargon C. l'ensemble : type identi cateur  liste-de-d clarations-de-param.

liste-de-d clarations-de-param.tres  e e porte le nom bizarre de prototype de fonction . identi cateur est le nom de la fonction . S mantique : e type est le type de la valeur rendue par la fonction .

tres est la liste s par s par des virgules e e e e des d clarations des param.

tres formels. de d clarer des variables qui seront locales . La liste-de-d clarations option permet si e e e besoin est.

la fonction. expression est valu e. Parmi ces instructions. il doit y avoir e e au moins une instruction du type : return Note expression . elles seront donc e a inaccessibles de l'ext rieur. et le contr^le e e e o d'ex cution est rendu a l'appelant de la fonction. Lors de l'ex cution d'une telle instruction. La valeur rendue par la fonction e . La liste-d'instructions est l'ensemble des instructions e qui seront ex cut es sur appel de la fonction.

est celle de expression. 22 .

int j * * * la fonction sum_square d livre un int e ses param.Exemple int sum_squareint i.

* retour a l'appelant en d livrant r sultat e e * Instruction return L'instruction return est une instruction comme une autre.int j * * * la fonction max d livre un int e ses param. resultat = i*i + j*j. returnresultat.tres formels sont les int i et j e d claration des variables locales e * * * int resultat. il est donc possible d'en utiliser autant qu'on le d sire dans le corps d'une fonction. Exemple : e int maxint i.

else returnj. Si la derni.tres formels sont les int i et j e pas de variables locales pour max * * * if i j returni.

e e e la valeur rendue par la fonction est ind termin e. e e Les param.re instruction ex cut e par une fonction n'est pas une instruction return.

tres formels e Dans le cas o.

une fonction n'a pas de param.

le mot cl void est mis en u e e tant que liste-de-d clarations-de-param.tres formels.

14159. * * pas de param. Exemple : e e double pivoid return3.tres.

tres formels e pas de variables locales * * Attention La syntaxe des d clarations pour les param.

on peut utiliser deux e e e d clarations : e int i.j. Quand on a besoin de d clarer deux variables du m^me type. Mais on peut aussi n'utiliser qu'une d claration pour d clarer les deux variables : e e int i. int j.tres formels et les variables n'est pas la e e m^me. 23 .

Cette possibilit n'existe pas pour une liste de param.

tres formels. Il n'est pas possible e e d' crire max de la mani.

puis pass es en tant que pae e e ram.2 Appel d'une fonction Syntaxe : expression :  identi cateur  liste-d'expressions  S mantique : e Les expressions de liste-d'expressions sont valu es.j .re suivante : e e int maxint i. * incorrect * 1..15..

tres e ectifs .

m = maxa. * * * appel de sum_square appel de max appel de pi * * * Attention 1. double d.m. d = pi. qui est ensuite ex cut e.b. Exemple : int a. s = sum_squarea. la fonction de nom identi cateur.b.s.b. Dans le cas d'une fonction sans param. La e a e e valeur rendue par la fonction est la valeur de l'expression appel de fonction.

tre. la liste-d'expressions doit ^tre vide : il e e n'est pas possible d'utiliser le mot cl void en tant que param.

L'ordre d' valuation des param.tre e ectif. e e d = pivoid. * appel incorrect de pi * 2.

tres e ectifs n'est pas sp ci . La fonction g sera peut-^tre ex cut e avant f. e e e 24 . e Exemple : sum_squarefx. l'ordre dans lequel ils se feront n'est pas garanti.gy. Si certains de ceuxe e e e ci r alisent des e ets de bords.

3 Les proc dures e Le langage C ne comporte pas .1.15.

a e les fonctions pouvant r aliser sans aucune restriction tout e et de bord qu'elles d sirent. Cependant. e e le programmeur peut r aliser une proc dure a l'aide d'une fonction qui ne rendra aucune e e . strictement parler le concept de proc dure.

Une proc dure e e e sera donc impl ment e sous la forme d'une fonction retournant void et dont la partie listee e d'instructions ne comportera pas d'instruction return. Lors de l'appel de la proc dure. valeur. Pour exprimer l'id e de  aucune valeur . il faudra ignorer la valeur rendue c'est . on utilise le mot-cl void.

. * * la proc dure et ses param.int j int r. Exemple void print_addint i. r = i + j. . dire ne pas e a l'englober dans une expression..

tres formels e e une variable locale .

a = 12.b. print_add a * * * instruction pour imprimer la valeur de r * void printsvoid int a. b = 45. print_add13. print_adda.67.b. * * une proc dure sans param.

tres e e variables locales .

prints a * * * * appel de print_add un autre appel .

print_add a * * Probl.

me de vocabulaire e Dans la suite du texte. nous utiliserons le terme de fonction pour d signer indi reme e ment une proc dure ou une fonction. chaque fois qu'il ne sera pas n cessaire de faire la e e distinction entre les deux.4 Fonctions imbriqu es e . 1.15.

Il n'est donc pas possible qu'une fonction ne soit connue qu'. les fonctions imbriqu es n'existent pas dans le langage e C. A l'inverse de certains langages.

1.15. l'int rieur d'une autre a e fonction.5 R cursivit e e int factoint n Il n'y a rien de sp cial .

faire .

la d claration d'une fonction pour qu'elle puisse ^tre e a a e e appel e de mani.

re r cursive. Voici un exemple de factorielle : e e e 25 .

1. else returnn * facton-1.if n == 1 return1.15.6 R f rence .

Cela se fait en pr xant l'en-t^te de la fonction du mot cl e e e e e extern. Le cas le plus courant d'utilisation de fonction d nie ailleurs est l'utilisation des fonctions e de la biblioth. une fonction externe ee a Quand on d sire utiliser une fonction qui est d nie ailleurs. il est n cessaire de la e e e d clarer comme tant externe. int j. comme ceci : extern int sum_squareint i.

Avant d'utiliser une fonction de la biblioth.que standard.

il e e faudra donc la d clarer en fonction externe. Il y a une m thode permettant de faire cela e e de mani.que standard.

re automatique gr^ce au m canisme d'inclusion de source du pr processeur.7 Comprendre la documentation de la biblioth. e 1. Cela e a e e est expliqu dans la documentation de chaque fonction.15.

que standard e Dans la documentation concernant les fonctions de la biblioth.

Il faut comprendre que le chier math.h contient un ensemble de d nitions n cessaires . que ce e soit dans la norme ou dans les manuels unix. Exemple de la fonction cosinus : Synopsis include math. se trouve toujours une commande d'inclusion de source. Dans ces paragraphes.que standard.h double cosdouble x. l'information concernant l'interface d'appel de la fonction se trouve dans le paragraphe Synopsis.

e e a l'utilisation de cos. en particulier la d claration de cos en fonction externe. .

Dans la e e version k&r du langage.8 Les fonctions dans le style K&R La d nition des fonctions est la plus importante di rence entre ansi et k&r. le prototype c'est . Il faut donc inclure le chier math.15. 1.h avant toute utilisation de la fonction cos. savoir : e a extern double cosdouble x.

dire la liste-de-d clarations-de-param.

qui sont les noms des param.tres a e e est remplac par une liste d'identi cateurs.

La d clarae e e tion des types des param.tres.

tres se fait juste apr.

s. de la mani.

j int i.re suivante : e e e int sum_squarei. int j. int resultat. * * liste des noms des param. resultat = i*i + j*j. returnresultat.

tres formels e d claration du type des param.

tres e e * * 26 .

il faut pr xer avec le mot-cl e e e extern.En ce qui concerne la d claration de fonction externe. l'en-t^te de la fonction d barrass e de la liste des noms des param.

le compilateur ne conna^t pas le type des param.tres. comme e e e e ceci : extern int sum_square. Dans ce cas.

il lui e est donc impossible de d tecter une erreur portant sur le type des param.tres de la fonction.

cela signi e que cette m thode sera e e e abandonn e dans la prochaine r vision de la norme. En clair. en pr cisant toutefois que la m thode e e e e e e e k&r tait une caract ristique obsolescente. qui sont crites a la e e e . Il n'a cependant pas voulu faire un changement incompatible.15. e e e Remarque Nous ne pouvons que conseiller l'utilisation exclusive des prototypes de fonctions. il a donc d cid que les deux m thodes taient accept es. si prochaine r vision il y a. Cette situation est assez catastrophique et c'est la raison pour laquelle le comit de normalisation a introduit le concept de prototype de fonction vu au e chapitre 1.1. et de ne jamais utiliser la m thode k&r. Si nous avons expos celle-ci.tres lors d'un e e appel de fonction externe. c'est pour permettre e e au lecteur de comprendre les quantit s normes de source C existant.

1. il est n cessaire de faire appel aux possibilit s de la e e e biblioth. k&r.16 Impression formatt e e Pour faire des entr es-sorties.

Celle-ci comporte une proc dure permettant de r aliser des sorties e e e formatt es : il s'agit de printf. On l'appelle de la mani.que standard.

re suivante : e e printf  cha^ne-de-caract.

res . liste-d'expressions  . e cha^ne-de-caract.

res est le texte .

Ces s quences d' chappement sont e e compos e du caract. imprimer dans lequel on peut librement mettre des e a s quences d' chappement qui indiquent le format selon lequel on veut imprimer la valeur e e des expressions se trouvant dans liste-d'expressions .

re  suivi d'un caract.

Il existe e e e entre autres.re qui indique le format d'impression. c pour un caract.

re. d pour un entier .

imprimer en d cimal. x pour un e a e entier .

j.i. int j = 32. imprimera : la valeur de i est 12 et celle de j est 32 Il est possible d'avoir une liste-d'expressions vide. printf"la valeur de i est d et celle de j est d". dans ce cas l'appel a printf devient : . Exemple : a e int i = 12. imprimer en hexad cimal.

printf  cha^ne-de-caract.

* b est back-space * 6. pour imprimer le mot erreur en le soulignant 6. a condition que la sortie se fasse sur un terminal papier . e par exemple. on peut crire : e printf"erreur b b b b b b______".res  .

27 .

En t^te du programme il faudra donc mettre : e include stdio. Les variables sont des variables dont la dur e de e vie est gale . Un programme C est une suite de d clarations de variables et de d nitions e e de fonctions dans un ordre quelconque.h e qu'il faudra inclure avant toute utilisation.h 1.17 Structure d'un programme Nous ne consid rerons pour d buter que le cas de programmes form s d'une seule unit e e e e de compilation.Fichier d'include La d claration de printf en tant que fonction externe se trouve dans le chier stdio.

par opposition aux variables d clar es . celle du programme. Ces e a variables sont dites variables globales. et qui sont accessibles par toutes les fonctions.

il est g n ralement consid r comme tant un bon ee ee e style de programmation de regrouper toutes les d clarations de variables en t^te du proe e gramme. l'int rieur e e a e des fonctions qui sont dites locales. mais il doit y avoir au moins la d nie e tion d'une proc dure dont le nom soit main. le syst. car pour lancer un programme C. La structure d'un programme devient alors la suivante : programme :  liste-de-d clarations option e liste-de-d nitions-de-fonctions e Il peut n'y avoir aucune d claration de variable. Bien que ce ne soit pas obligatoire.

Exemple : e int i.j.b.me e e appelle la proc dure de nom main.j.c sont des variables globales * * * * * * * * * * * * * d but de la d finition de la proc dure p1 e e e p1 a un seul param.c. double a. void p1int k * i.b.a.

tre entier : k e variables locales .

p1 a instructions de p1 qui peuvent acc der .

j.a.s et t fin de la d finition de p1 e d but de la d finition de la fonction f1 e e f1 a deux param.c.b.i. e a k.

tres flottants: x et y e variables locales .

f1 a instructions de f1 qui peuvent acc der .

. ..u et v fin de la d finition de f1 e * * * * * * * * * * * * int s.i... e a x.y. int f1double x..j... . .double y double u.a.t. .b.c.v. 28 ..

* * * d but du main. il n'a pas de param...int main .

18 Terminaison d'un programme On peut r aliser la terminaison d'un programme en appelant la fonction exit qui e fait partie de la biblioth.tre e e instructions qui appellerons p1 et f1 fin de la d finition de main e * * * 1.

que standard. Cette fonction admet un param.

tre entier qui est e e un code indiquant le type de la terminaison : une valeur nulle indique que le programme s'est convenablement termin . e Cette valeur est transmise a l'environnement d'ex cution du programme 7 d'une mani. toute valeur non nulle indique une terminaison avec erreur.

re .

e e Un retour de la fonction main est quivalent . e e d pendante de l'impl mentation.

un appel .

la fonction exit en lui e a a passant en param.

1. il faut donc terminer la fonction main par return0.19 Mise en oeuvre du compilateur C sous UNIX Le lecteur sera suppos ma^triser un diteur de textes lui permettant de cr er un chier e e e contenant le source d'un programme. Supposons que le nom d'un tel chier soit essai1.c.tre la valeur retourn e par main. Si l'environnement d'ex cution teste e e e la valeur rendue par le programme. pour en r aliser sous unix la compilation et l' dition de liens avec la biblioth.

que standard. il su t e Pour v ri er qu'il n'y a pas de probl.c le binaire ex cutable se trouve alors dans le chier e d' mettre la commande : e essai1 essai1. Pour l'ex cuter. e e e il faut mettre la commande : e cc -o essai1 essai1.

. on peut e e essayer sur un des plus petits programmes possibles.me pour la mise en uvre du compilateur.

Exemple : e e include stdio. et n'ayant qu'une seule proc dure qui sera la proc dure main. savoir un programme sans variables a globales. c Ecrire un programme comportant : 1.h int main printf"a marche!! n". la d claration de 3 variables globales enti.

minutes. e e 7.res heures. secondes . Sous unix ce sera le shell de l'utilisateur 1.20 Exercice 29 .

heures . une proc dure set_heure qui admettra trois param...2.. secondes en respectant l'orthographe du singulier et du pluriel. une proc dure print_heure qui imprimera le message : e Il est ... 3.. minutes .

tres de type entiers h. . e e dont elle a ectera les valeurs respectivement a heures. s. minutes et secondes . m.

e e ee Une solution possible est donn e ci-apr. une proc dure tick qui incr mentera l'heure de une seconde . e e 5. la proc dure main sera un jeu d'essai des proc dures pr c dentes . 4.

s. e e 30 .

minutes. minutes.heures.minutes. if heures 1 printf"s". printf" d seconde". printf" d minute".include stdio. if secondes 1 printf"s". secondes. printf" n". secondes * * * ***************************************************************************** void print_heure printf"Il est d heure". if minutes 1 printf"s". ***************************************************************************** * * * print_heure * * * * But: * * Imprime l'heure * * * * Interface: * * Utilise les variables globales heures.secondes. ***************************************************************************** * * * set_heure * * * * But: * * Met l'heure .h int heures.

une certaine valeur a * * * * Interface: * * h. s sont les valeurs . m.

donner .

int s heures = h. heures. secondes = s. secondes a a * * * ***************************************************************************** void set_heureint h. minutes = m. int m. secondes * * * ***************************************************************************** void tick 31 . minutes. ***************************************************************************** * * * tick * * * * But: * * Incr mente l'heure de une seconde e * * * * Interface: * * Utilise les variables globales heures. minutes.

***************************************************************************** * * * main * * * ***************************************************************************** int main set_heure3. print_heure. set_heure3. if heures = 24 heures = 0. tick.59. set_heure1. heures = heures + 1. if minutes = 60 minutes = 0. print_heure.32.10.secondes = secondes + 1.59.59.59. tick. print_heure. minutes = minutes + 1. tick. tick. if secondes = 60 secondes = 0. set_heure23. print_heure. 32 .32.59.

si vous m'avez suivi jusqu'au bout de ce chapitre indigeste. Tous les ans. mais qui est  int ressant  . Le but est de produire ee un programme qui se compile et s'ex cute sans erreur. vous m ritez e un divertissement. est organis sur Internet le concours international du code C le plus obscur e International Obfuscated C Code Competition. dont le source est volontairement e le plus obscur possible ce qui est facile.1. ioccc en abr g .21 R cr ation e e Ami lecteur.

un titre ou .

C'est sur ce dernier point que doit s'exercer la cr ativit des participants. Il y a quelques petites licences prises par rapport . h las e e e pour lui. les meilleures contributions sont de v ritables joyaux et sont librement accessibles via e l'url : ftp: ftp. Son e e programme a ceci d'extraordinaire que le source C peut se lire comme un texte en  anglais  : il s'agit d'une conversation pistolaire entre un amoureux et sa belle r tive.net pub ioccc.uu. Nous pr sentons ci-dessous la contribution de Brian Westley pour l'ann e 1990. Tous les e e ans. un e a a autre.

Il y a aussi un probl. mais c'est parfaitement lisible. du vrai anglais : 1s est a pris comme une approximation du mot anglais is. 1l est pris comme approximation de ll dans I'll get a break et des signes cabalistiques sont introduits entre les mots.

me avec le langage C : le compilateur utilis en 1990 par B. Westley e e n' tait pas ansi et acceptait le su xe s derri.

re une constante enti.

Si on transforme les 1s en 1. le programme se compile et s'ex cute sans e erreur. L'ex cutable est un programme .. d'e euillage de la marguerite ! Il faut lui passer e en param.re pour lui donner le e e e type short int..

char lotte.out & out . dear. et le programme e ee e va  dire  : love me. Voici le texte du programme : e char*lie. double time. char*lie= 8. not. me= !0XFACE. 8 un nombre de fois gal au e nombre de p tales.lie. forget= !me.. love me. signed char lotte. **let= !!me *!not+ ++die. die char ly. love me not etc. **die . int rested.tre un nombre sens ^tre le nombre de p tales de la marguerite. my= dear. get. charlotte--. not 1 . mainly. Les anglais semblent avoir une conception binaire du sentiment amoureux 33 . out. love me not.

forget=! get. break. love ly char++lotte+ !!0xBABE .'I'-1l. not. not. this +1s+ not. char*lie++. !not +char*lie*'s'. !out. & 0xD0.get.'U' 'I' . char*lie.!out. char*lie++. for *char*&lotte^= charlotte.!'a'.'a'. define love char*lie love 1s *!not= atoilet get -me? charlottecharlotte: my."The gloves are OFF this time. while love char*lie. while!"you're at it". get= 0xFF. case' ': *char*&lotte += 15.long . do not* putcharlie out *!not* !!me +charlotte . hell:0. register this. snot n 0sed GEEK!". while my .4 . if 'I' -lie 2 +charlotte  'I'-1l ***die. if not-- goto hell. switch charlie charlotte -1s *!out char*les.. 34 . puts* out .'c' -'P'-'S' +die+ -2 .*love . get *out* shortly -0-'R'. for. I detest you. else if 'I' * get *out* 'I'-1l **die 2  *char*&lotte -= '4' .dear && 'I'-1l -get.'U' . char*lie charlotte. do not= *lie++ & 0xF00L* !me.!not return!! charlotte.'a'^rested. get . my. char*lie++. exit charlotte. that.*love 'I' .!! time =out= 'a'. default: 0xF +char*lie. do auto*eroticism.

e comment faire r f rence .Chapitre 2 Les tableaux Dans ce chapitre nous allons voir comment d clarer un tableau. comment l'initialiser.

Du point de vue algorithmique. on a besoin d'intructions it ratives. nous passerons donc en revue e l'ensemble des instructions it ratives du langage. quand on ee a ee utilise des tableaux. un des ses l ments. Nous terminerons par un certain nombre e d'op rateurs tr.

e ajouter entre crochets le nombre d' l ments du tableau apr.1 D claration de tableaux dont les l ments ont un type de base e ee Pour d clarer un tableau dont les l ments ont un type de base : e ee partir de la d claration de variable ayant un type de base .1 Les tableaux 2.s utiles pour mettre en uvre ces instructions. e e 2.1.

s le nom. ee e Exemple : int t 10 . t2 tableau de 20 long int * * En pratique. il est recommand de toujours donner un nom a la constante qui indique le e . * * t tableau de 10 int t1 tableau de 10 long int. long int t1 10 . t2 20 .

Les points importants sont les suivants : les index des l ments d'un tableau vont de 0 . nombre d' l ments d'un tableau. Exemple : ee define N 100 int t N .

ee a la taille d'un tableau doit ^tre connue statiquement par le compilateur.1 . N . o. e Impossible donc d' crire : e int t n .

u 35 . n serait une variable.

et entour e des signes et . 3.2 Initialisation d'un tableau On peut donner moins d'expressions constantes que le tableau ne comporte d' l ments. ee Dans ce cas.Il est possible d'initialiser un tableau avec une liste d'expressions constantes s par es e e par des virgules. 2. 2. 4. les premiers l ments du tableau seront initialis s avec les valeurs indiqu es. Exemple : e define N 5 int t N = 1. ee e e les autres seront initialis s a z ro.1. Exemple : e . 5 .

2 . e define N 10 int t N = 1. les ee e autres l ments seront initialis s . Les l ments d'indice 0 et 1 seront initialis s respectivement avec les valeurs 1 et 2.

permettant d'exprimer  iniee tialiser n l ments avec la m^me valeur v . z ro. Cas particulier des tableaux de caract. Il faut soit mettre n fois la valeur v dans ee e l'initialisateur. soit initialiser le tableau par des instructions. ee e a e Il n'existe malheureusement pas de facteur de r p tition.

res e Un tableau de caract.

res peut ^tre initialis par une liste de constantes caract.

res. e e e e Exemple : char ch 3 = 'a'. 'c' . 'b'. C'est videmment une m thode tr.

e e e Un tableau de caract.s lourde.

On se rappelle que le compilateur compl. Exemple : e e e e char ch 8 = "exemple".res peut ^tre initialis par une cha^ne litt rale.

te toute cha^ne litt rale avec un caract.

il faut donc que le tableau ait au moins un l ment de plus que le nombre de ee caract.re e e e null.

e e Il est admissible que la taille d clar e pour le tableau soit sup rieure .res de la cha^ne litt rale.

dans ce cas. la taille de la e e e a cha^ne litt rale. seuls les 8 premiers caract. Exemple : e char ch 100 = "exemple".

le e compilateur a le bon go^t de compter le nombre de caract. e e Il est galement possible de ne pas indiquer la taille du tableau et dans ce cas.res de ch seront initialis s.

res de la cha^ne litt rale u e e et de donner la taille ad quate au tableau sans oublier le null. Exemple : e char ch = "ch aura 22 caract.

res". e 36 .

Il est galement possible de donner au tableau une taille gale au nombre de carace e t.

3 R f rence . Dans ce cas. 2. Exemple : char ville 8 = "bordeaux".res de la cha^ne.1. le compilateur comprend qu'il ne faut pas rajouter e le null de la n de cha^ne.

une r f rence . un l ment d'un tableau ee a ee Syntaxe : Dans sa forme la plus simple.

un l ment de tableau a la syntaxe ee a ee suivante : expression :  nom-de-tableau expression 1 S mantique : expression 1 doit d livrer une valeur enti.

et l'expression d livre l' l e e e e ee ment d'indice expression 1 du tableau. t i+j = k. on peut crire : e x = t i . dans le contexte de la d claration : e define N 10 int t N . Par exemple. Une telle expression est une lvalue.re. on peut donc la rencontrer aussi bien en partie gauche qu'en partie droite d'a ectation. * * r f rence .

4 Cha^nes et tableaux de caract.1. l' l ment d'indice i du tableau t e e a e e affectation de l' l ment d'indice i+j du tableau t e e * * 2.

res e Le langage C fait la distinction entre tableau de caract.

res et cha^ne de caract.

res : une e e cha^ne de caract.

res est un tableau de caract.

res dont la n est indiqu e par un caract.

C'est une convention tr.re e e e e null.

s pratique exploit e par la biblioth.

que standard.1 Instruction for Syntaxe : instruction :  for  expression 1 option instruction . expression 3 option  S mantique : l'ex cution r alis e correspond . e e e 2.2. expression 2 option .2 Les instructions it ratives e 2.

l'organigramme suivant : e e e e a 37 .

.

Leur fonction logique est d'^tre respectivement les parties e e initialisation et it ration de la boucle. e puisque leur valeur est inutilis e. L' expression 2 est utilis e pour le test de bouclage. auquel on a enlev la ou les parties correspondantes. Exemple de boucle for Initialisation d'un tableau a z ro : . la s mantique est e celle de l'organigramme pr c dent. e e L'instruction est le travail de la boucle. expression1 ? ? ? ? - expression2 != 0? oui instruction expression3 non n du for Lorsque l'on omet expression1 et ou expression2 et ou expression3 . ee e Remarques On voit que la vocation de expression 1 et expression 3 est de r aliser des e ets de bord.

2 Instruction while Syntaxe : instruction :  while  expression  instruction S mantique : e l'ex cution r alis e correspond a l'organigramme suivant : e e e . for i = 0. e define N 10 int t N . i = i + 1 t i = 0.2. 2. i N.

38 .

- .

S mantique : e l'ex cution r alis e correspond a l'organigramme suivant : e e e .2. expression != 0? oui instruction ? ? non n du while 2.3 Instruction do Syntaxe : instruction :  do instruction while  expression  .

- .

S mantique : e Provoque l'arr^t de la premi.2. 2.4 Instruction break Syntaxe : instruction : instruction ? ? expression != 0? oui non n du do  break .

e e 39 . while. do englobante.re instruction for.

i = i + 1 0  continue.. sauf ceux qui sont n gatifs : ee e for i = 0. * * on passe au i suivant dans le for traitement de l' l ment courant e e * * 2. S mantique : e Dans une instruction for. N. i if t i .. i = i + 1 if t i == 0 break.5 Instruction continue Syntaxe : instruction :  continue .Exemple L'instruction for ci-dessous est stopp e au premier i tel que t e for i = 0. i N.3 Les op rateurs e Le langage C o re un op rateur d'incr mentation qui peut ^tre utilis soit de mani. while ou do.2. i est nul : 2. e e e Exemple Supposons que l'on parcoure un tableau t pour r aliser un certain traitement sur tous e les l ments. et le passage au d but de l'it ration suivante. l'instruction continue provoque l'arr^t de e l'it ration courante.

re e e e e e pr x . soit de mani.

Cet op rateur se note ++ et s'applique .re post x .

soit ++ lvalue utilisation en pr x . soit lvalue ++ e e utilisation en post x . une lvalue. Tout comme l'op rateur d'a ectation. l'op rateur d'incr mentae e e e tion r alise a la fois un e et de bord et d livre une valeur : e . Sa e e e e e a syntaxe d'utilisation est donc au choix.

e ++ lvalue incr mente lvalue de 1 et d livre cette nouvelle valeur. t i++ = 0. t i++ = 0. e e 2. * * met . e e lvalue ++ incr mente lvalue de 1 et d livre la valeur initiale de lvalue.3. i = 1.1 Op rateur pr et postincr ment e e e Exemples Soient i un int et t un tableau de int : i = 0.

z ro l' l ment d'indice 0 a e e e met .

z ro l' l ment d'indice 1 a e e e * * 40 .

t ++i t ++i = 0. * * met . = 0.

z ro l' l ment d'indice 2 a e e e met .

2 Op rateur pr et postd cr ment e e e e Il existe galement un op rateur de d cr mentation qui partage avec l'op rateur incr e e e e e e ment les caract ristiques suivantes : e il peut s'utiliser en pr xe ou en post x .3. z ro l' l ment d'indice 3 a e e e * * 2. e e il s'applique .

t i-. e Cet op rateur se note -. une lvalue. t --i = 0. .lvalue d cr mente lvalue de 1 et d livre cette nouvelle valeur.et d cr mente la lvalue de 1 : e e e -. a il fait un e et de bord et d livre une valeur. t i-. i = 8. * * met . t --i = 0.= 0. e e e Exemples Soient i un int et t un tableau de int : i = 9.d cr mente lvalue de 1 et d livre la valeur initiale de lvalue. e e e lvalue -.= 0.

z ro l' l ment d'indice 9 a e e e met .

z ro l' l ment d'indice 8 a e e e * * * * met .

z ro l' l ment d'indice 7 a e e e met .

Les op rateurs ++ e e et -.r alisant pr cis ment un e et de bord. et que cela n'a de sens que si l'expression r alise un e et de bord. z ro l' l ment d'indice 6 a e e e * * 2.3. permettent donc d' crire des instructions e e e e se r duisant .3 Quelques utilisations typiques de ces op rateurs e Utilisation dans les instructions expression On a vu qu'une des formes d'instruction possibles en C est : expression .

une expression utilisant un de ces op rateurs. Une incr mentation ou une e a e e d cr mentation de variable se fait classiquement en C de la mani.

re suivante : e e e i++. * * incr mentation de i e d cr mentation de j e e * * Utilisation dans les instructions it ratives e for i = 0. i++ Une boucle for de parcours de tableau s' crit typiquement de la mani. i . N. j--...

re suivante : e e 41 .

3. Par exemple dans le cas d'un parcours de tableau . && rend la On voit donc que l'op rateur && r alise le et logique de expression 1 et expression 2 en e e prenant pour faux la valeur 0. si sa valeur est non nulle. l'expression && rend la valeur 0 .2. et pour vrai toute valeur di rente de 0. et 1 sinon. expression2 est valu e. si sa valeur est nulle. Ceci pr sente un int r^t dans certains cas de parcours de tableau ou de liste de blocs e ee cha^n s. et l'expression e e valeur 0 si expression2 est nulle. 2. e Remarque sur la s mantique e On a la certitude que expression 2 ne sera pas valu e si expression 1 rend la valeur e e faux.4 Op rateur et logique e Syntaxe : expression :  expression 1 && expression 2 S mantique : e expression1 est valu e et : e e 1.

la recherche d'un l ment ayant e a ee une valeur particuli.

o.re. supposons que l'on utilise comme test de n de boucle l'expression e i n && t i != 234 on boucle tant que ce test est vrai.

i n est le test permettant de ne pas d border u e du tableau. et t i != 234 est le test de l' l ment recherch . S'il n'existe dans le tableau ee e aucun l ment gal .

il va arriver un moment o. 234.

e 42 .5 Op rateur ou logique e Syntaxe : expression :  expression 1 || expression 2 S mantique : e expression 1 est valu e et : e e si sa valeur est non nulle.. 2. ...3. ee e Exemples d'utilisation int a. 64. on va valuer i n && t i != 234 ee e a u e avec i = n.. on ne court donc pas le risque d'avoir une erreur mat rielle t n peut e e e r f rencer une adresse m moire invalide. l'expression || d livre la valeur 1 . La s mantique de l'op rateur && assurant que l'expression t i != 234 ne e e sera pas valu e. if a 32 && b if  a && b 1 b = a 32 && b 64 .b.

l'expression || d livre la e e e valeur 0 sinon elle d livre la valeur 1. e On voit donc que l'op rateur || r alise le ou logique de ses op randes. expression 2 est valu e. toujours avec e e e les m^mes conventions pour les valeurs vrai et faux. .sinon. si sa valeur est nulle.

e e e 2. . on a la certitude que le second e op rande ne sera pas valu si le premier d livre la valeur vrai. et n'importe e a quelle valeur non nulle pour vrai. si sa valeur est nulle. e Cet op rateur r alise le non logique de son op rande. 64.. savoir 0 pour faux. sinon e e e e il d livre la valeur 0.4 Exercice D clarer un tableau nb_jour qui doit ^tre initialis de faon . 2. Dans ce cas galement. l'op rateur ! d livre la valeur 1.b. if a 32 || b if  a || b 1 b = a 32 || b 64 .3. e e e e Exemples int a....6 Op rateur non logique e Syntaxe : expression :  ! expression S mantique : e expression est valu e.

ce que nb_jour i soit e e e c a gal au nombre de jours du ieme mois de l'ann e pour i allant de 1 .

La proc dure main e e se contentera d'appeler les proc dures d'initialisation et d'impression de nb_jour. Ecrire une proc dure d'impression des 12 valeurs utiles de nb_jour. e Ecrire une proc dure d'initialisation de nb_jour qui utilisera l'algorithme suivant : e si i vaut 2 le nombre de jours est 28 . e 43 . sinon le nombre de jours est 31. sinon si i pair et i = 7 ou i impair et i 7 le nombre de jours est 30 . 12 nb_jour 0 sera e e a inutilis .

***************************************************************************** * * * init_nb_jours * * * * But: * * Initialise le tableau nb_jours * * * ***************************************************************************** void init_nb_jours int i. i++ if i == 2 nb_jours 2 = 28. else nb_jours i = 31.h int nb_jours 13 . for i = 1. ***************************************************************************** * * * main * * * ***************************************************************************** int main init_nb_jours. i++ ".nb_jours i . print_nb_jours. = 7 || i  2 == 1 && i 7  ***************************************************************************** * * * print_nb_jours * * * * But: * * Imprime le contenu du tableau nb_jours * * * ***************************************************************************** void print_nb_jours int i. for i = 1. i printf"d printf" n".include stdio. i = 12. = 12. 44 . else if  i  2 == 0 && i nb_jours i = 30.

1 Notion de pointeur Une valeur de type pointeur rep.Chapitre 3 Les pointeurs 3.

char *pc.3 Type de pointeur g n rique e e Le type void * est le type pointeur g n rique.re une variable. c'est . e ajouter le signe * devant le nom de la variable. cela signi e qu'une valeur e de type pointeur est l'adresse d'une variable.2 D clarations de variables de type pointeur vers les types e de base Pour d clarer une variable pointeur vers un type de base : e partir de la d claration d'une variable ayant un type de base . variable de type pointeur vers un int int - 372 3. Exemple : int *pi. En pratique. short int *psi. * * * * pi est un pointeur vers un int psi est un pointeur vers un short int pd pointeur vers un flottant double pr cision e pc pointeur vers un char * * * * 3. double *pd.

dire capable de pointer vers n'imee a porte quel type d'objet. il ne serait pas possible par exemple d'indiquer 45 . Sans un tel type.

puisque ce type varie d'une invocation a l'autre de la fonction. e .le type d'objet rendu par les fonctions d'allocation de m moire qui rendent un pointeur e vers l'objet allou .

Par exemple. la fonction malloc de la biblioth.

que standard est d nie de la mani.

re e e e 1 suivante : void *mallocsize t size. Note La solution quand on utilisait les compilateurs K&R tait d'utiliser le type char * qui e jouait de mani.

re conventionnelle ce r^le de pointeur g n rique. la fonction malloc d nie de la mani. Le lecteur ne s' tonnera e o ee e donc pas de trouver dans les vieux ? manuels.

re e e suivante : char *mallocsize.4 Op rateur adresse de e L'op rateur & appliqu . 3.

cette adresse pourra e ea e ^tre a ect e . une variable d livre l'adresse de celle-ci .

pi = &i. une variable de type pointeur. int *pi. * * pi pointeur vers un int * * le pointeur pi rep. On peut crire par exemple : e e a e int i.

appliqu a une valeur de type pointeur. il agit de l'op rateur indirection e e e e e e qui. On peut crire par e.re la variable i e 3.5 Op rateur d'indirection e Lorsque l'op rateur * est utilis en op rateur pr x . d livre la valeur point e.

*pi = 2. j = *pi + 1. e e e exemple : int i. La grammaire l. int *pi. pi = &i. * * * initialisation du pointeur pi initialisation de la valeur point e par pi e une utilisation de la valeur point e par pi e * * * Remarque L'op rateur * est surcharg : il peut ^tre op rateur de multiplication ou op rateur e e e e e d'indirection.

size t est un type d ni dans stddef.ve l'ambigu t car l'op rateur d'indirection est pr x . la multiplication des deux valeurs point es s' crit : *i**j e e 1. alors e e e e e que l'op rateur de multiplication est in x . Surcharger les op rateurs g^ne la lisibilit des e e e e e programmes. Exemple : si i et j sont des pointeurs vers des entier.h e 46 .

e e . e mais *i *j est-il le quotient des valeurs point es? R ponse a la n de ce chapitre. *i**j est le produit des valeurs point es.Devinette Si i et j sont des pointeurs vers des entiers.

D clarer un entier i et un pointeur p vers un entier . 3. 2. e Initialiser l'entier a une valeur arbitraire et faire pointer p vers i . . 5. 4. 3.6 Exercice 1.

Une solution possible est donn e page suivante. Imprimer la valeur de i . e 47 . e Imprimer la valeur de i. pas i . Modi er l'entier point par p en utilisant p.

printf"valeur de i avant: d n".i. printf"valeur de i apr. p = &i. *p = 2.h ***************************************************************************** * * * main * * * ***************************************************************************** int main int i. int *p.include stdio. i = 1.

s: d n".i. e 48 .

mais il e e e permet galement de r aliser la somme d'un pointeur et d'un entier.7 Pointeurs et op rateurs additifs e 3.3.7.1 Op rateurs + et e L'op rateur + permet de r aliser la somme de deux valeurs arithm tiques. que si le pointeur rep. Une telle op ration e e e n'a de sens cependant.

si p rep.re un l ment d'un tableau. e ee Soient p une valeur pointeur vers des objets de type T et un tableau dont les l ments ee sont du m^me type T .

p + j est une valeur e e ee de type pointeur vers T.re l' l ment d'indice i du tableau. qui rep.

Il en va de m^me avec l'op rateur soustraction : si p rep.re l' l ment d'indice i + j du tableau en supposant e ee qu'il existe.

p .j rep.re l' l ment d'indice i d'un e e e ee tableau.

*r. r = &t N-1 .*s. p = &t 0 .re l' l ment d'indice i . * * * * p rep. e ee Exemple : define N 10 int t N .N-1. q = p + N-1.j du tableau toujours en supposant qu'il existe.*q. int *p. s = r .

re le premier l ment de t e e e q rep.

re le dernier l ment de t e e e r rep.

re le dernier l ment de t e e e s rep.

re le premier l ment de t e e e * * * * La norme pr cise que pour r aliser la somme ou la di rence d'un pointeur et d'un e e e entier. il faut qu'.

la fois le pointeur et le r sultat rep.

rent les l ments d'un m^me tableau a e e ee e ou l' l ment  ctif apr.

L'expression p + N est valide. si on a : ee e ee define N 100 int t N . En d'autre termes. La possibilit e de r f rencer l' l ment  ctif apr. mais p .1 ou p + N + 1 ne sont pas valides. int * p = &t 0 .s le dernier l ment du tableau.

s le dernier l ment d'un tableau a t introduite pour ee ee e ee ee les probl.

e On peut appliquer les op rateurs ++ et -.mes de n de boucle de parcours de tableau mais on aurait pu s'en passer.

Exemple on rappelle que toute cha^ne est e termin e par un null. c'est a dire le caract. des pointeurs et il est classique de les e a utiliser pour r aliser des parcours de tableaux.

re ' 0' : e .

p++ * ici p rep. *p != ' 0'.2 Op rateurs ++ et -e for p = &mess 0 . = "Hello world!!". 3. e char mess char *p.7.

re l' l ment courant de mess e e e * 49 .

while *p != ' 0' * ici utilisation de *p++ * 3.8 Di rence de deux pointeurs e Il est possible d'utiliser l'op rateur de soustraction pour calculer la di rence de deux e e pointeurs. Cela n'a de sens que si les deux pointeurs rep.Autre classique. en reprenant les variables mess et p de l'exemple pr c dent : ee p = &mess 0 .

Soient p1 et p2 deux pointeurs du m^me type tels que p1 rep.rent des l ments d'un m^me e ee e tableau.

p2 .p1 est une valeur de type tableau. et p2 rep.re le ieme l ment d'un e e ee eme l ment du m^me tableau.

re le j e e e e ptrdiff_t qui est gale .

h En pratique. j . une variable de type ptrdiff_t pourra ^tre utilis e comme une e e variable de type int.i. Le type ptrdiff_t est d ni dans le chier d'include e a e stddef. La norme pr cise qu'il est valide de calculer la di rence de deux e e pointeurs .

condition que tous deux rep.

ou l' l ment a e ee e ee  ctif apr.rent des l ments d'un m^me tableau.

sans utiliser aucune variable de type entier. ee Une solution possible est donn e page suivante. Ecrire une proc dure qui parcoure le tableau t et qui imprime les e index des l ments nuls du tableau. e 50 . e ee 3.9 Exercice D clarer et initialiser statiquement un tableau d'entiers t avec des valeurs dont cere taines seront nulles.s le dernier l ment du tableau.

***************************************************************************** * * * print1 * * Premiere version * * * ***************************************************************************** void print1 int *pdeb. * * rep. pdeb = &t 0 .14.*p.13.include stdio.0.h define N 10 int t N = 1.11.0.12.4 . pfin = &t N-1 .*pfin.2.0.

re le premier l ment de t e e e rep.

*pfin. * rep. p++ if *p == 0 printf"d ".p . ***************************************************************************** * * * print2 * * Une autre version * * * ***************************************************************************** void print2 int *pdeb.*p. pfin = pdeb + N. pdeb = &t 0 . p = pfin. printf" n".pdeb.re le dernier l ment de t e e e * * for p = pdeb.

re le premier l ment de t e e e * * rep.

***************************************************************************** * * * main * * * ***************************************************************************** int main print1. p pfin. 51 . print2. printf" n".re l' l ment fictif apres le dernier l ment de t * e e e e e for p = pdeb.p . p++ if *p == 0 printf"d ".pdeb.

10 Passage de param.3.

tres e 3.1 Les besoins du programmeur En ce qui concerne le passage de param.10.

tres .

le programmeur a deux e a e besoins fondamentaux : soit il d sire passer une valeur qui sera exploit e par l'algorithme de la proc dure e e e c'est ce dont on a besoin quand on crit par exemple sinx. Une telle faon de e c passer un param. une proc dure.

tre s'appelle du passage par valeur . e soit il d sire passer une r f rence .

de mani. une variable.

re a permettre .

la proc e ee a e .

a e dure de modi er la valeur de cette variable.c o. C'est ce dont on a besoin quand on crit e une proc dure r alisant le produit de deux matrices prodmata.b.

la matrice c soit gale au produit matriciel des e e matrices a et b. prodmat a besoin des valeurs des matrices a et b. et d'une r f rence ee vers la matrice c. l'on veut e e u qu'en n d'ex cution de prodmat. Une telle faon de passer un param.

3.tre s'appelle du passage par c e adresse.2 Comment les langages de programmation satisfont ces besoins Face .10.

les concepteurs de langages de programmation ont imagin di a e e rentes mani. ces besoins.

res de les satisfaire. et quasiment chaque langage de programmation dispose e de sa strat gie propre de passage de param.

tres. e e Une premi.

re possibilit consiste .

arguer du fait que le passage de param.

et .tre par e e a e adresse est plus puissant que le passage par valeur.

r aliser tout passage de a e param.

e e Une seconde possibilit consiste a permettre au programmeur de d clarer explicitee .tre par adresse c'est la strat gie de fortran et pl 1 .

e ment quels param.

tres il d sire passer par valeur et quels param.

tres il d sire passer e e e e par adresse c'est la strat gie de pascal . e La derni.

re possibilit consistant .

r aliser tout passage de param.

tre par valeur e e a e e semble irr aliste puisqu'elle ne permet pas de satisfaire le besoin de modi cation e d'un param.

10. tout param. C'est cependant la strat gie choisie par les concepteurs du langage e e C.tre.3 La strat gie du langage C e En C. 3.

et cette r.tre est pass par valeur.

Cela pose le probl.gle ne sou re aucune excepe e e tion.

me de r aliser un passage de param.

tre par adresse lorsque le e e e programmeur en a besoin. La solution a ce probl.

a d clarer le pa.me consiste dans ce cas.

e .

e ram.

ade e e mettant trois param.tre comme tant un pointeur. e e Voyons sur un exemple. Cette solution n'est rendue possible que par l'existence e e de l'op rateur adresse de qui permet de d livrer l'adresse d'une lvalue. Supposons que nous d sirions crire une proc dure add.

Nous d sirons que le r sultat de l'ex cution de add e e e e soit d'a ecter au param.tres a. b et c.

tre c la somme des valeurs des deux premiers param.

Le e e param.tres.

tre c ne peut videmment pas ^tre pass par valeur. puisqu'on d sire modi er la e e e e e 52 .

valeur du param.

tre e ectif correspondant. Il faut donc programmer add de la mani.

int *c * c rep. int b.re e e suivante : void addint a.

re l'entier o.

j. on veut mettre le r sultat e u e * *c = a + b.k. int main int i. * on passe les valeurs de i et j comme premiers param.

tres e * on passe l'adresse de k comme troisi.

me param.

tre e e addi. lorsque ee l'on crit f&i. * * 3.11 Discussion 1.&k.j. Nous estimons qu'il est int ressant pour le programmeur de raisonner en terme de e passage par valeur et de passage par adresse et qu'il est pr f rable d'a rmer.  i est pass par adresse .

plut^t que d'a rmer  l'adresse de e e a o i est pass e par valeur . f .

f  . tout en sachant que c'est la deuxi.

me a rmation qui e a  e colle le mieux .

Que l'on ne s' tonne donc pas dans la a e e e suite de ce manuel de nous entendre parler de passage par adresse. la stricte r alit du langage. Nous retiendrons qu'en C. 2. le passage de param.

tre par adresse est enti.

C'est .rement g r e e ee par le programmeur.

la charge du programmeur de d clarer le param.

. et de bien songer.. lors de l'appel de e e la fonction.tre a e e concern comme tant de type pointeur vers . .

passer l'adresse du param.

12 Une derni.tre e ectif. a e 3.

re pr cision e e Quand un langage o re le passage de param.

tre par valeur. il y a deux possibilit s : e e 1. soit le param.

tre est une constante donc non modi able e 2. soit le param.

tre est une variable locale .

la proc dure. Cette variable est initialis e e a e e lors de l'appel de la proc dure avec la valeur du param.

Supposons que l'on d sire crire une fonction sum admettant comme param. e e C'est la seconde solution qui a t retenue par les concepteurs du langage C.tre e ectif. Voyons sur un ee exemple.

On peut programmer de la mani.tre n e e e et qui rende la somme des n premiers entiers.

re suivante : e 53 .

0. n returnr. for  . On voit que le param. n-- r = r + n.int sumint n int r = 0.

et que dans l'instruction for. e 3.13 Exercice On va coder un algorithme de cryptage tr.tre n est utilis comme variable locale. e e la partie initialisation est vide puisque n est initialis e par l'appel de sum.

etc.s simple : on choisit un d calage par exemple e e 5. un c par un h. et un a sera remplac par un f. un b par un g. On ne cryptera que e les lettres majuscules et minuscules sans toucher ni a la ponctuation ni .

la mise en page .

a caract.

On supposera que les codes des lettres se suivent de a a z e .res blancs et line feed.

et de A .

On demande de : a 1. d clarer un tableau de caract. Z.

e e e 2. crire une proc dure crypt de cryptage d'un caract.res mess initialis avec le message en clair .

re qui sera pass par adresse . e e 54 . crire le main qui activera crypt sur l'ensemble du message et imprimera le r sultat. e e e e 3.

h char mess = "Les sanglots longs des violons de l'automne n blessent mon coeur d'une langeur monotone". define DECALAGE 5 ***************************************************************************** * * * crypt * * * * But: * * Crypte le caract.include stdio.

re pass en param.

tre e e e * * * * Interface: * * p : pointe le caract.

re .

***************************************************************************** * * * main * * * ***************************************************************************** int main char *p. if casse == BAS && *p 'z' || casse == HAUT && *p 'Z' *p = *p -26. while*p cryptp++. HAUT . crypter e a * * * ***************************************************************************** void cryptchar *p enum BAS. else return. * * impression du r sultat e printf"R sultat: n". int i. printf" n". *p = *p + DECALAGE. else if *p = 'A' && *p = 'Z' casse = HAUT. * 55 . e printfmess. int casse. if *p = 'a' && *p = 'z' casse = BAS. * phase de cryptage p = &mess 0 .

14 Lecture formatt e e Il existe dans la biblioth.3.

liste-d'expressions  . format est une cha^ne de caract.que standard une fonction de lecture formatt e qui fonctionne e e selon le m^me principe que la proc dure printf. Sa syntaxe d'utilisation est la suivante : e e scanf  format .

e e c pour un caract.res indiquant sous forme de s quences d' chappement les e e e entit s que scanf lit sur l'entr e standard : e e d pour un nombre d cimal . e x pour un nombre crit en hexad cimal .

re. e Tous les l ments de la liste-d'expressions doivent d livrer apr.

Si le ot de caract.s valuation l'adresse de ee e e e la variable dans laquelle on veut mettre la valeur lue.

res lu sur e l'entr e standard ne correspond pas a format. scanf cesse d'a ecter les variables de listee .

d'expressions .

la premi.

cette instruction va lire un nombre crit en d cimal et mettre sa valeur dans la variable e e i.&j. puis lire un nombre crit en hexad cimal et mettre sa valeur dans la variable j.re disparit . On e e aura remarqu que les param. Exemple : a e e scanf"d x".&i.

tres i et j ont t s pass s par adresse .

scanf. seul i e e recevra une valeur. Valeur rendue Attention Sur rencontre de n de chier. Une erreur facile a commettre est d'omettre les op rateurs & devant les param. sinon elle rend le nombre de variables qu'elle a pu a ecter. Si l'entr e standard ne commence pas par un nombre d cimal. Si l'entr e e e ee e a e standard commence par un nombre d cimal non suivi d'un nombre hexad cimal. ni i ni e e j ne recevront de valeur. la fonction scanf rend EOF.

tres de .

e e scanf. C'est une erreur di cile a d tecter car le compilateur ne donnera aucun message .

e d'erreur et .

et le programme s'avortera 2 sur l'ex cution du scanf. Avec un peu de chance ces valeurs seront des adresses invalides. l'ex cution. ce sont les valeurs de i et j qui seront interpr t es comme des a e ee adresses par scanf. ce qui donnera une id e du probl.

et le scanf s'ex cutera en allant craser les valeurs d'autres variables qui ne demandaient e e rien . e e e Avec un peu de malchance.me. ces valeurs donneront des adresses parfaitement acceptables.

rendant tr. personne. Le programme pourra s'avorter beaucoup plus tard.

15 Les derni.s di cile a e la d tection de l'erreur. e 3.

ee e un goto et une instruction nulle. 2. Le terme avorter est .res instructions e Le langage C comporte 3 instructions que nous n'avons pas encore vu : un if g n ralis .

prendre au sens technique de abort a 56 .

. case expression n : liste-d'instructionsn default : liste-d'instructions expression 1 expression 2 : : liste-d'instructions1 option liste-d'instructions2 option break. ee e Syntaxe : instruction :  switch  expression  case case .1 Instruction switch Le langage C o re une instruction switch qui est un if g n ralis .option break..option De plus : toutes les expression i doivent d livrer une valeur connue a la compilation ..option option break.15. e .3.

puis le r sultat est compar avec expression 1 . S mantique : e 1. 2. . expression est valu e. e e l'alternative default est optionnelle. etc. exprese e e e sion 2 . il ne doit pas y avoir deux expression i d livrant la m^me valeur .

la premi.

re expression i dont la valeur est gale .

on a e e a ex cute la ou les 3 liste-d'instructions correspondantes jusqu'. celle de expression.

la rencontre e a de la premi.

re instruction break. La rencontre d'une instruction break termine e l'ex cution de l'instruction switch. e 3. si il n'existe aucune expression i dont la valeur soit gale ..

sinon e on ne fait rien. Premi. e a on ex cute la liste-d'instructions de l'alternative default si celle-ci existe. il y a 3 types d'utilisations possibles pour le switch. Vu le nombre de parties optionnelles dans la syntaxe. celle de expression.

la ou les. car dans chaque case. on peut avoir dans chaque alternative une e e liste-d'instructions et un break. comme dans l'exemple suivant : Discussion 3. le break est optionnel 57 .re possibilit .

BLANC. case ROUGE : printf"rouge". void print_colorint color switchcolor case BLEU : printf"bleu". ROUGE . case BLANC : printf"blanc". break. default : printf"erreur interne du logiciel num ro xx n". break.enum BLEU=1. e Deuxi. break.

on peut avoir une ou plusieurs alternatives ne poss dant ni listee e e d'instructions. ni break.me possibilit .. Supposons que l'on d sire compter dans une suite de caract.

res. e e le nombre de caract.

res qui sont des chi res. et le nombre de caract.

Troisi. default: nb_non_chiffres++.res qui ne le sont pas. break. e e On peut utiliser le switch suivant : switchc case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': nb_chiffres++.

e 58 . case POSSIBLE: printf"possible n". une alternative peut ne pas avoir de break comme dans l'exemple e e suivant : enum POSSIBLE. case default: printf"erreur interne du logiciel num ro xx n". void print_casint cas switch cas case IMPOSSIBLE: printf"im". break. IMPOSSIBLE .me possibilit .

Une telle utilisation du switch pose un probl.

me de lisibilit . car l'exp rience montre e e e que l'absence du break. est tr.

s di cile .

4 que l'instruction break e e permettait de stopper l'ex cution d'une instruction it rative for. do. Il est utilis e e e ici de mani. * ATTENTION: pas de break. par exemple de la faon suivante : c case IMPOSSIBLE: printf"im". voir. Il est donc recommand de mettre un e a e commentaire. * Remarque Le mot-cl break est surcharg : nous avons vu au chapitre 2.2. while.

re compl.

tement di rente. Une instruction goto identi cateur a pour e et de transee f rer le contr^le d'ex cution a l'instruction tiquet e par identi cateur. L'instruction e o e .15.2 Instruction goto Syntaxe : instruction :  goto identi cateur . e e e 3. S mantique : e Toute instruction peut ^tre pr c d e d'un identi cateur suivi du signe :. Cet identi e eee cateur est appel tiquette.

. e e goto et l'instruction cible du goto doivent se trouver dans la m^me proc dure : le e e langage C est un langage a branchement locaux.

goto etiq2.. goto etiq1..... Exemple : etiq2: . * * * * * des instructions goto avant d finition de l' tiquette e e des instructions des instructions goto apr.. . etiq1: .

S mantique : e ne rien faire ! 59 .3 Instruction nulle Syntaxe : instruction :  .15.s d finition de l' tiquette e e e * * * * * 3.

Cette instruction ne rend que des services syntaxiques. Elle peut ^tre utile quand on e d sire mettre une tiquette .

fin: . Par exemple : e e a e .. la n d'une instruction compos e.. Elle est galement utile pour mettre un corps nul .

. certaines instructions it ratives. e a e En e et.

cause des e ets de bord dans les expressions. on peut arriver parfois .

Par exemple. on o e peut initialiser a z ro un tableau de la mani. faire a a tout le travail dans les expressions de contr^le des instructions it ratives.

re suivante : .

Supposons que l'on e veuille crire la boucle : e for i = 0. * instruction nulle * Attention Cette instruction nulle peut parfois avoir des e ets d sastreux. N. t i++ = 0 . . e e for i = 0. i t i = i. i N. i++ si par m garde on met un .

mais ne fait absolument pas ce qui tait pr vu. i t i = i. qui s'ex cute sans broncher. i++ . la n de ligne du for. ex cute le for avec le seul e et d'amener la variable i . on obtient un programme parfaitement e a correct. N. En e e e e et : for i = 0.

et ensuite ex cute une e a e fois t i = i ce qui a probablement pour e et d' craser la variable d clar e juste apr. la valeur N.

3.16 Exercice Ecrire une proc dure main se comportant comme une calculette c'est a dire ex cutant e .s e e e e le tableau t.

imprimer le r sultat. e une boucle sur : 1. lecture d'une ligne suppos e contenir un entier. e 60 . e 2.*  . 3. un op rateur et un entier ex : 12 + e e 34. calculer la valeur de l'expression . les op rateurs seront + .

Commentaire de la solution Nous faisons ici un commentaire sur la solution propos e qui se trouve .

Dans le cas o. la page e a suivante.

le programme met un message d'erreur et ex cute exit1. la ligne lue n'a pas une syntaxe correcte elle ne contient pas un u nombre. un nombre. e e Ceci ne r alise pas un interface utilisateur bien agr able. Cela n'a pas t impl ment car ce ee e e n'est pas r alisable . un signe. car il serait plus int ressant de e e e continuer la boucle au lieu de terminer le programme.

l'aide des seules possibilit s de base de scanf qui ont t pr sent es. scanf sera expliqu de mani. e a e ee e e Dans le chapitre  Les entr es-sorties .

re exhaustive et une e e e meilleure version de ce programme sera pr sent e. e e 61 .

&i. ***************************************************************************** * * * main * * * ***************************************************************************** int main int i.j. switch c case '+' : r case '-' : r case '*' : r case ' ' : if  j == = i + j.&c. break. VRAI .j. char imp. default : printf"l'op rateur c est incorrect n". break.r.h FAUX. break. break. = i * j. break. exit1. printf"Erreur de syntaxe n".c. int ret. while 1 if ret = scanf"d c d". case '' : r = i  j.&j != 3 if ret == EOF exit0. char c. imp = VRAI. e imp = FAUX. 62 . imp = FAUX. else r = i j. = i . e * fin du switch * if imp printf"d n".r.include enum stdio. 0 * * * * les op randes * e l'op rateur e * bool en de demande d'impression du r sultat e e code de retour de scanf * * printf"Division par z ro n".

--deliver rahctup = putchar reviled* *deliver .0xDECAL + LACEDx0 rof . * * 63 .deliver++.int--tni.tni . rof . tni = int .putchar   .reviled = 1+1 . redivider = "Able was I ere I saw elbA" .int--tni.reviled* *deliver. int tni = reviled . char rahc = " n " .--deliver. deliver = redivider .int tni.++inttni rof = int -1. * deliver. for .int tni.17 R cr ation e e Pour les amateurs de palindromes.++reviled.3. for inttni++. main   * * int tni = 0x0 . niam . voici la contribution de Brian Westley a la comp e tition du code C le plus obscur ioccc de 1987.LACEDx0 = 0xDECAL. rahctup. rahctup * putchar char * rahc .reviled--. for reviled--.

L'ex cution de ce programme imprime le palindrome :  Able was I ere I saw elbA . *i *j n'est pas un quotient. 64 . Pour obtenir e le quotient de *i par *j il faut utiliser du blanc : *i *j. car * est un d but de commentaire. e R ponse de la devinette e Non.

1 Conversion des tableaux Nous avons jusqu'.Chapitre 4 Relations entre tableaux et pointeurs 4.

pr sent utilis les tableaux de mani.

re intuitive. Il est temps maintenant ee e d'exposer une caract ristique originale des r f rences a un tableau dans le langage C : elles e ee . en nous contentant a e e e de savoir qu'on peut d clarer un tableau par une d claration du genre : e e int t 10 . et qu'on dispose d'un op rateur d'indexation not . permettant d'obtenir un l ment du e e ee tableau : l' l ment d'index i du tableau t se d signe par t i .

subissent une conversion automatique. R.

Remarques 1. elle n'a pas lieu lors de la d claration. e Quand on d clare int T 10 . que cette occurrence de T sera convertie en type int *. ee Cette conversion n'a lieu que pour un identi cateur de type  tableau de x  apparaissant dans une expression.gle : e Tout identi cateur de type  tableau de x  apparaissant dans une expression est converti en une valeur constante dont : le type est  pointeur vers x  . En particulier. La conversion automatique d'un identi cateur ayant le type tableau emp^che de e d signer un tableau en entier. c'est pour cette raison que l'op rateur d'a ectation ne e e peut a ecter un tableau a un autre tableau : . le compilateur m morise que T est de type  tableau de e e 10 int  et r serve de la place en m moire pour 10 entiers. la valeur est l'adresse du premier l ment du tableau. de e valeur adresse de T 0 . C'est lors de toute utilisation e e ult rieure de l'identi cateur T.

65 . int t1 10 .

t1 = t2. * le compilateur rejettera cette instruction * Un telle a ectation ne peut se r aliser qu'.int t2 10 .

Un identi cateur ayant le type tableau est converti en une valeur constante. t. t 10 . on ne peut donc rien lui a ecter : int int t = p = *p. l'aide d'une proc dure qui r alisera e a e e l'a ectation l ment par l ment. p. ee ee 2. * * interdit valide * * L'existence des conversions sur les r f rences aux tableaux va avoir deux cons quences ee e importantes : la premi.

re concerne l'op rateur d'indexation et la seconde le passage de e e tableaux en param.

tre.2 L'op rateur d'indexation e La s mantique de l'op rateur d'indexation consiste . e 4.

dire qu'apr.

s les d clarations : e e a e e int t N . int i. t i est quivalent .

V ri ons que cela est bien conforme . *t + i.

la faon dont nous e a e a c l'avons utilis jusqu'.

pr sent. Nous avons vu que t .

pour valeur l'adresse du premier e a e a l ment du tableau. D'apr.

ee Si nous appliquons l'op rateur d'indirection .s ce que nous savons sur l'addition entre un pointeur et un ee e entier. nous pouvons conclure que t + i est l'adresse de l' l ment de rang i du tableau.

t+i nous obtenons l' l ment de rang i e a ee du tableau. ce que nous notions jusqu'.

pr sent t i . et pour ne pas rompre avec les habitudes de programmation. e cons quence num ro 2 e e Puisque l'op rateur d'indexation s'applique . a e cons quence num ro 1 e e L'op rateur d'indexation not est donc inutile. et n'a t o ert que pour des raisons e e ee de lisibilit des programmes.

on va poue a voir l'appliquer . des valeurs de type pointeur.

n'importe quelle valeur de type pointeur. apr. et pas seulement aux constantes a rep rant des tableaux. En e et.

p 0 tant t e e donc ^tre utilis comme un sous-tableau de t. p peut . et utiliser l'op rateur d'indexation sur p. on peut crire : e p = &t 4 . e e 66 4 .p 1 tant t e 5 . int * p.s les d clarations : e e e int t 10 . etc.

cons quence num ro 3 e e L'op rateur d'indexation est commutatif ! En e et. t i tant quivalent a *t + i e e e .

et l'addition tant commutative. t i est quivalent .

Lorsqu'on e e a . *i + t donc a i t .

et doit ^tre consid r e comme une cons quence pathologique e e e ee e de la d nition de l'op rateur d'indexation. utilise l'op rateur d'indexation. e e 4. on peut noter indi remment l' l ment de rang i d'un e e ee tableau. une telle e e notation doit ^tre prohib e. Il est bien vident que pour des raisons de lisibilit .3 Passage de tableau en param. t i ou i t .

lorsqu'un tableau est pass en param.tre e Du fait de la conversion d'un identi cateur de type tableau en l'adresse du premier l ment.

c'est cette adresse qui est pass e ee e e e en param.tre e ectif.

tre. Le param.

tre formel correspondant devra donc ^tre d clar comme tant e e e e e e de type pointeur. Voyons sur un exemple. Soit .

crire une proc dure imp_tab qui est charg e d'imprimer ae e e un tableau d'entiers qui lui est pass en param.

tre. On peut proc der de la mani.

* d finition de imp_tab e * Cependant. c'est . i++ printf"d ". int nb_elem int i. cette m thode a un gros inconv nient.*t + i.re e e e e suivante : void imp_tabint *t. lorsqu'on lit l'en-t^te de cette e e e proc dure. for i = 0. i nb_elem. En e et.

dire la ligne : e a void imp_tabint *t. int nb_elem il n'est pas possible de savoir si le programmeur a voulu passer en param.

tre un pointeur e vers un int c'est .

c'est . ou au contraire si il a voulu a passer un tableau. dire un pointeur vers un seul int.

De faon . dire un pointeur vers une zone de n int.

le langage C e e e admet que l'on puisse d clarer un param. ce que le a c a programmeur puisse exprimer cette di rence dans l'en-t^te de la proc dure.

tre formel de la mani.

. *  * corps de la proc dure proc e car le langage assure que lorsqu'un param.re suivante : e e e void procint t ..

il est consid r comme tant de type pointeur e e e ee e vers x.tre formel de proc dure ou de fonction est e e d clar comme tant de type tableau de x. on se souvient que la notation *t + i est quivalente . Si d'autre part.

la notation e a t i . la d nition de imp_tab peut s' crire : e e 67 .

t i .void imp_tabint t int i. i++ printf"d ". et sera donc pr f r e. L'appel c eee se fera de la mani. i . for i = 0. int nb_elem * d finition de imp_tab e * nb_elem. Cette faon d'exprimer les choses est beaucoup plus claire.

NB_ELEM.re suivante : e define NB_ELEM 10 int tab NB_ELEM . int main imp_tabtab. Remarque Quand une fonction admet un param.

il y a deux cas possibles: e .tre de type tableau.

soit les di rents tableaux qui lui sont pass s en param.

et dans ce cas la taille doit ^tre un param.tre e ectif ont des tailles e e e di rentes.

comme dans l'exemple pr c dent .tre suppl mentaire de la e e e e fonction. ee soit les di rents tableaux qui lui sont pass s en param.

tre e ectif ont tous la m^me e e e e taille. et dans ce cas la taille peut appara^tre dans le type du param.

4...4 Modi cation des l ments d'un tableau pass en paraee e m.tre e ectif : e define NB_ELEM 10 void imp_tabint t NB_ELEM  .

tre e Lorsqu'on passe un param.

tre e ectif .

on a vu que e a e l'on passait une valeur. une proc dure ou une fonction. Il est donc impossible .

une proc dure de modi er la valeur d'une a e variable pass e en param.

on passe .tre. e e En ce qui concerne les tableaux par contre.

La proc dure pourra donc modi er si elle le d sire les l ments du ee e e ee tableau. la proc dure l'adresse du premier a e l ment du tableau. Il semble donc que le passage de tableau en param.

tre se fasse par adresse et non e par valeur et qu'il s'agisse d'une exception .

la r.

gle qui a rme qu'en C. tout passage a e de param.

tre se fait par valeur. Mais il n'en est rien : c'est la conversion automatique des e identi cateurs de type tableau qui provoque ce ph nom.

e e 68 .ne.

Du point de vue pratique. on retiendra que l'on peut modi er les l ments d'un tableau ee pass en param.

int nb_elem int i.tre. i++ t i ++. On peut crire par exemple : e e e * incr_tab fait + 1 sur tous les l ments du tableau t e e void incr_tabint t . * 4. for i = 0. i nb_elem.5 Interdiction de modi cation des l ments d'un tableau ee pass en param.

le comit en charge du travail a pens qu'il e e tait important d'introduire dans le langage un m canisme permettant au programmeur e e d'exprimer l'id e :  cette proc dure qui admet en param.tre e e Lors de la normalisation du langage C.

ne doit pas en e e e modi er les l ments . un nouveau mot-cl a t introduit. Pour r aliser cela. le mot ee e e ee const. qui permet de d clarer des variables de la mani.tre ce tableau.

L'int r^t de e ee const se manifeste pour les param. qui d clare une variable de nom i dont il est interdit de modi er la valeur.re suivante : e e const int i = 10.

pour exprimer le fait que cette proc dure ne doit pas modi er les l ments du e ee tableau t.t i . for i = 0. int nb_elem * d finition de imp_tab e * 4. . on peut et il est recommand de l' crire de la faon suivante : e e c void imp_tabconst int t int i. i++ printf"d ".6 Conversion des cha^nes litt rales e On rappelle que les cha^nes litt rales peuvent ^tre utilis es lors de la d claration avec e e e e initialisation d'un tableau de caract. Reprenons l'exemple de la proc dure e e imp_tab.tres de fonction. i nb_elem.

ou ^tre utilis es dans une expression et ^tre pass es en param.res. comme ceci : e char message = "Bonjour !!".

69 . e e e e e comme cela : printf"Bonjour".tre de fonction par exemple.

R.

gle e Lorsque les cha^nes litt rales apparaissent dans un autre contexte qu'une d claration e e avec initialisation de tableau de caract.

res. Si une fonction a comme param. elles subissent une conversion en pointeur vers e char.

tre formel un tableau de caract.

res. on pourra lui e e passer en param.

tre e ectif aussi bien le nom d'un tableau de caract.

.7 Retour sur printf Nous avons vu au paragraphe 1.. * corps de la fonction f * fmess. * * un appel possible de f un autre appel possible de f * * 4.res qu'une cha^ne e e litt rale. f"Hello".16 que la fonction printf admet comme premier param. void f char t  . Exemple : e char mess = "Bonjour".

tre une cha^ne .

imprimer comportant ventuellement des s quence d' chappement : e a e e e d. o et x pour imprimer un nombre respectivement en d cimal. octal et hexad cimal et e e c pour imprimer un caract.

re. Il existe aussi une s quence d' chappement pour imprimer e e e les cha^nes de caract.

printf"Message = s n". 4. p = mess1. char *p..p. Exemple : e char mess1 = "Hello". D clarer et initialiser deux tableaux de caract.8 Exercice 1.res :s. char mess2 = "Bonjour". if . else p = mess2..

e e 2. Ecrire une fonction lg_chaine1 qui admette en param.res ch1 et ch2.

tre un tableau de caract.

et qui rende le nombre de caract.res e e se terminant par un null.

e e mais en donnant .res du tableau null exclu. e 3. Ecrire une fonction lg_chaine2 qui impl mente le m^me interface que lg_chaine1.

son param.

tre le type pointeur vers char. a e 4. La proc dure main imprimera le nombre d' l ments de ch1 et ch2 par un appel .

70 . e ee a lg_chaine1 et lg_chaine2.

h define NULL_C ' 0' char ch1 = "cette cha^ne comporte 35 caract.include stdio.

res". e char ch2 = "et celle ci fait 30 caract.

res". e ***************************************************************************** * * * lg_chaine1 * * * * But: * * calcule la longueur d'une cha^ne de caract.

res e * * * * Interface: * * ch : la cha^ne de caract.

res e * * valeur rendue : la longueur de ch * * * ***************************************************************************** int lg_chaine1const char ch  int i = 0. != NULL_C i++. while ch i returni. * ***************************************************************************** * * * lg_chaine2 * * * * But: * * identique . * e quivalent a whilech i  i++.

lg_chaine1ch1.lg_chaine2ch2. ch++. while *ch != NULL_C i++. celui de lg_chaine1 a * * * ***************************************************************************** int lg_chaine2const char *ch int i = 0. printf"la longeur de ch2 est d n". returni. ***************************************************************************** * main * ***************************************************************************** int main printf"la longeur de ch1 est d n". 71 .

un tableau multidimensionnel est consid r comme tant un tableau dont les ee e l ments sont eux m^mes des tableaux.9 Tableaux multidimensionnels En C. Un tableau .4.

deux dimensions se d clare donc de ee e a e la mani.

9.1 D clarations e Les m^mes consid rations que celles que nous avons d velopp es sur les tableaux .re suivante : e int t 10 20 . 4.

une e e e e a dimension s'appliquent. .

. savoir : a 1.

la d claration. le compilateur allouera une zone m moire permettant de stocker de a e e mani.

soit 200 entiers . toute r f rence ult rieure .re contigue 10 tableaux de 20 entiers. e 2.

t sera convertie en l'adresse de sa premi.

9. 4. avec ee e a e le type pointeur vers tableau de 20 int.re ligne.2 Acc.

s aux l ments e ee L'acc.

s .

3 Passage en param. un l ment du tableau se fera de pr f rence par l'expression t e a ee ee i j .9. 4.

* N  corps de p * Lorsqu'on d sire qu'un param..tre e define N 10 pint t ..

tre formel soit un tableau .

deux dimensions. il faut le e e a d clarer comme dans l'exemple suivant : e On peut en e et omettre la taille de la premi.

car le compilateur en a besoin pour g n rer le code ee permettant d'acc der .re dimension. mais il est n cessaire d'indiquer e e la taille de la seconde dimension.

si T est la taille des l ments de t. Le compilateur . un l ment. l'adresse e a ee ee de t i j est : adresse de +   +   . En e et.

ce a sera donc une constante. Par contre. besoin de conna^tre N. la taille de la premi.

re dimension pourra ^tre pass e e e e en param.

tre. comme nous l'avons fait pour les tableaux .

j++ t i j = 0. une seule dimension. Exemple : e a t i N j T define P 10 void raz_matint t int i. for i = 0. int n 72 . i++ for j = 0.j. i n. P . j P.

ne sera appliquable qu'.

des tableaux dont la premi.

re dimension .

une taille a e a quelconque. mais dont la seconde dimension doit imp rativement avoir P l ments.10 Initialisation Un tableau multidimensionnel peut ^tre initialis a l'aide d'une liste de listes d'exprese e. e ee raz_mat 4.

22. 30.13.11.24 .3.14 .1. Exemple : int t 4 5 = 0.32.31. . 10. c'est . Un telle initialisation doit se faire avec des expressions constantes.12.2.23.21. sions constantes. 20.34 .4 .33.

dire d livrant a e une valeur connue .

e 2. D clarer et initialiser statiquement une matrice 5. la compilation.5 d'entiers tab. a 4. Ecrire une fonction print_mat qui admette en param.11 Exercice 1.

5 et qui e imprime ses l ments sous forme de tableau.tre une matrice 5. e . ee 3. La proc dure main fera un appel a print_mat pour le tableau tab.

73 .

30.include stdio.22.33.14 . i++ for j = 0.3.31.2.44 .11.12. 74 . ***************************************************************************** * * * print_mat * * * * But: * * Imprime un tableau N sur N N est une constante * * * ***************************************************************************** print_matint t N  int i. for i= 0.41. 40.h define N 5 int tab N N = 0.21. ***************************************************************************** * * * main * * * ***************************************************************************** int main print_mattab.34 .32.13.4 . 20.t i j .1.42.24 . j++ printf"d ". j N.j. printf" n". 10. i N.43.23.

1 Cas g n ral ee Pour des raisons de gain de place m moire.4.12.12 Tableau de pointeurs 4. on est parfois amen .

cr er des tableaux e ea e a .

deux dimensions dont toutes les lignes n'ont pas la m^me taille. Ceci peut se r aliser .

e e a l'aide d'un tableau de pointeurs vers des tableaux de tailles di rentes. associ .

les programmeurs ont l'habitude de  tricher . On obtient alors la structure de donn es e suivante : taille tab 3 Si nous supposons que le type des objets terminaux est int. pour traduire cette structure de donn es en langage C. consid r comme tant trop ee e compliqu un tel type s' crit : int *tab NB_ELEM  . soit int *tab NB_ELEM . La solution habituellement retee e nue. consiste a utiliser le type tableau de pointeurs vers des int. . et de ne pas e utiliser le type tableau de pointeurs vers des tableaux de int. un autre e ea tableau qui donnera la taille de chaque ligne.

ligne3 . int ligne2 = 20. Nous donnons ee . Voici un exemple d'une telle d claration avec initialisation statique du tableau : e define NB_ELEM 3 int taille NB_ELEM = 1. int *tab = ligne1. 2. j i Pour une r f rence a l' l ment de la ligne . on n'a que l'embarras du choix. ligne2. int ligne3 = 30.21 .31. int ligne1 = 10 . 3 .32 .

ee ci-apr.

e e e ee Premi.s trois m thodes di rentes d'imprimer les l ments du tableau ligne par ligne.

re m thode e e On utilise un pointeur vers un entier que l'on fait progresser d' l ment en l ment dans ee ee une ligne : 75 .

for i = 0. i NB_ELEM.int i. p++ * acc. *p. i++ + taille i .

s .

printf" n". l' l ment courant par *p e a e e for p = tab i . * Deuxi. p tab i printf"d ".*p.

me m thode e e int i. j. ee NB_ELEM. i++ taille i . *p. j++ * acc. i On utilise un pointeur vers le premier l ment d'une ligne . ce pointeur reste xe. for i = 0.

s .

j printf"d ". j = 0. l' l ment courant par p j e a e e for p = tab i . * La derni.p j . printf" n".

re m thode est surprenante : pour la comprendre. on peut acc der . il su t de remarquer que e e la variable p dans la seconde solution est inutile.

int i. i++ Troisi. i NB_ELEM. j. l' l ment courant par e a ee la notation tab i j . for i = 0. *p.

me m thode e e for j = 0. j++ printf"d ". j taille i . * acc. tab i j .

s .

l' l ment courant par tab i e a e e printf" n". j * On remarquera que c'est la m^me notation que celle qui est utilis e quand on a un vrai e e tableau .

deux dimensions. c'est a dire une structure de donn es physiquement compl.

tea .

Que l'acc. e e ment di rente.

s .

deux structures de donn es di rentes puissent se r aliser e e a e e e de la m^me mani.

re. doit sans doute ^tre consid r comme une faiblesse du langage. e e e ee C'est pour les tableaux de caract.

res .

Alors qu'en toute rigueur il faudrait utiliser le type tableau de pointeurs vers des tableaux de char 76 .2 Tableaux de pointeurs vers des cha^nes 1. que se manifeste le plus soue a vent l'int r^t de disposer d'un tableau de lignes de longueurs di rentes : les longueurs des ee e cha^nes sont extr^mement variables. comme ceci : char * t NB_ELEM . La aussi. 4. les habitudes sont les m^mes. deux dimensions. les program e e meurs utilisent le type tableau de pointeurs vers des char 1 .12.

Une boucle d'impression des valeurs du tableau mois pourra ^tre : e define NBMOIS 12 int i. "avril". "mars". u e On remarquera que ceci est impossible avec tout autre type que les char : il est impossible d' crire : e int * tab = 1 . "mai". "ao^t". i NBMOIS .6 .On peut initialiser un tableau de ce type avec des cha^nes litt rales : e char * mois = "janvier". "f vrier". Les tableaux de pointeurs vers des cha^nes de caract.3 . "octobre". e "juillet". "septembre". for i = 0. 4. i++ printf"s n". "novembre".5. "d cembre" . "juin".mois i . 2.

res sont une structure de donn es e e importante. car c'est sur celle-ci que s'appuie la transmission de param.

Lorsqu'un utilisateur lance l'ex cution du programme prog avec e les param.tres lors de l'ex e e cution d'un programme.

param2. .tres param1.. paramn.. l'interpr teur de commandes collecte tous ces e e mots sous forme de cha^nes de caract.

res. cr e un tableau de pointeurs vers ces cha^nes. e e et lance la proc dure main en lui passant deux param.

tres : e e un entier contenant la taille du tableau . le tableau de pointeurs vers les cha^nes. Pour que le programme puisse exploiter les param.

la fonce e tion main doit ^tre d clar e de la mani.tres pass s par l'utilisateur.

 4..re suivante : e e e e int mainint argc.3 Param.12.. char *argv .

sont des noms traditionnels. ainsi que argv pour argument values. mais peuvent ^tre remplac s par n'importe quels autres noms . e e Comme exemple d'utilisation des param. seuls e e les types doivent ^tre respect s.tres d'un programme e Les noms argc pour argument count.

tres. nous donnons le source d'un programme e qui imprime son nom et ses param.

tres : e int mainint argc. char *argv int i. argv 0 . i argc. i++ printf"Param. for i = 1. printf"Nom du programme : s n".

tre d : s n".i. e  77 .argv i .

4. c'est la m^me chose? e Il y a un moment dans l' tude du langage C. o.13 Tableau et pointeur.

en un mot que c'est pratiquement la m^me chose. on a l'impression que les tableaux e u et les pointeurs sont plus ou moins interchangeables. il faut donc ^tre tr.

Quand on d clare. ailleurs qu'en param.s clair : un tableau et un pointeur ce n'est pas la e e e m^me chose.

Quand e e e on d clare int *p. e e sont les trois r. int t 10 .tre formel de fonction. et le compilateur r serve simplement e e un l ment de m moire pouvant contenir un pointeur. il s'agit toujours d'un pointeur. et le compilateur r serve une zone de 10 entiers cons cutifs. e e e on d clare un tableau. ee e Les caract ristiques du langage C qui cr ent la confusion dans l'esprit des utilisateurs.

ee 2. tout identi cateur de type tableau de x apparaissant dans une expression est converti en une valeur constante de type pointeur vers x. un param. et ayant comme valeur l'adresse du premier l ment du tableau .gles suivantes : e 1.

tre formel de fonction. 3. la s mantique de l'op rateur d'indexation est la suivante : T i est quivalent . de type tableau de x est consid r comme tant e ee e de type pointeur vers x .

e e e a *T + i.13. 4.1 Commentaires Bien noter les points suivants : Le point important a comprendre dans la r.

gle 2 est que tableau de x est la m^me .

e e chose que pointeur vers x uniquement dans le cas de param.

.tre formel de e fonction. est quivalent .. Donc void fonc int t  .

. . que ce soit d claration e e de variables globales ou locales a une fonction. e a void fonc int * t .. Les types des objets d clar s de type tableau ou de e e type pointeur sont di rents dans tous les autres contextes. .

Di rence entre r.

gle 1 et r.

gle 2 : une d claration int t 10 qui n'est pas un e e e e param.

Par contre.tre formel. Ce sont les utilisations ult rieures e e e de t qui subissent une conversion en type pointeur vers entier. . d clare un tableau de 10 entiers.

la a d claration d'un param.

tre formel int t . e 4.13.2 Cas particulier des cha^nes litt rales e char t Les cha^nes litt rales viennent ajouter . c'est la d claration elle-m^me qui est e e e e transform e en int *t.

. le compilateur alloue un tableau de 6 caract. car on peut d clarer e a e = "Hello". et char *p = "Hello". la confusion. Dans le premier cas.

res qu'il initialise avec les caract.

Toute e e occurrence de t dans une expression sera convertie en type pointeur vers char. l. o et 0. l. le compilateur alloue un tableau de 6 caract.res H. e. Dans le second cas.

res qu'il initialise de la m^me e e mani.

mais de surcro^t. il alloue une variable de type pointeur e vers char qu'il initialise avec l'adresse du premier caract.re que dans le premier cas.

re de la cha^ne. e 78 .

char t = "Hello". t: H e l l o \0 char *p = "Hello". p: H e l l o \0 Ceci est un cas particulier des tableaux de caract.

.14 R cr ation e e En illustration sur les bizarreries des tableaux dans le langage C. 2. e mais on ne peut pas d clarer un pointeur vers un tableau d'entiers par : e int *p = 1. voici la contribution de David Korn le cr ateur du korn shell . 3. 4. On peut d clarer un tableau d'entiers par int t = 1.res qui ne se reproduit pas avec les e autres types. 5 . 3.. 2. 4. 4. 5 .

ce programme n'imprime pas have fun with unix ou quelque chose de ce genre ! Le lecteur est invit .unix "have" +"fun"-0x60. la comp tition du code C le plus obscur e a e ioccc de 1987 : main printf&unix " 021six 012 0" . Non.

mais ea e quoi? la solution est donn e . essayer d' lucider ce programme oui. il imprime quelque chose.

la page suivante. e a 79 .

Voici les cl s de la compr hension : e e 1. Tout compilateur C poss.

de un certain nombre de constantes pr d nies d pendant e ee e de l'architecture de la machine sur laquelle il s'ex cute. tout compie lateur pour machine unix pr d nit la constante unix avec comme valeur 1. Donc ee le programme est quivalent . En particulier.

t i est quivalent . 2.1 "have" +"fun"-0x60. Si on se souvient qu'on a vu en 4.2 que pour un tableau t. : e a main printf&1 " 021six 012 0" .

on voit que 1 " 021six 012 0" est quivalent . e a i t .

" 021six 012 0" 1 et e a 1 "have" .

Donc &1 " 021six 012 0" est l'adresse du caract. "have" 1 .

re a e  dans la cha^ne " 021six 012 0" et "have" 1 est le caract.

3. On peut donc e r crire le programme : ee main printf"six 012 0". 'a' + "fun" -0x60. La n d'une cha^ne est signal e par un caract.re 'a'.

. Celui qui est ici est donc inutile. D'autre part.re null  0 et le compilateur en met e e un a la n de chaque cha^ne litt rale.

e il existe une notation plus parlante pour le caract.

re de code 012 c'est .

Le programme peut donc se r crire : ee main printf"six n". 'a' + "fun" -0x60. Le caract. il s'agit de la notation n. -0x60 4. dire new e a line.

donc 'a' e le programme : main printf"six n".re 'a' a pour code ascii 0x61."fun" + 1. est gal .

"fun" + 1 donc : est l'adresse du caract. 1. R crivons e a ee 5.

le programme devient e printf"six n". main il imprime donc unix.re u dans la cha^ne "fun"."un". 80 .

Chapitre 5 Les entr es-sorties e .

Nous allons donc consacrer un chapitre entier . le lecteur prouve sans doute le besoin de e e disposer de moyens d'entr es-sorties plus puissants que les quelques possibilit s de printf e e et scanf que nous avons pr sent es. A ce moment-ci de l' tude du langage.

cette e e a question. en pr sentant les primitives les plus utiles de la biblioth.

mais celles qui le sont. sont pr sent es de mani.que standard. Toutes e e les primitives ne sont pas pr sent es.

re e e e e e exhaustive et conforme .

on a besoin de disposer d'une valeur de e pointeur invalide pour indiquer la n de la liste. la norme ansi.1 Pointeur invalide Quand on programme des listes cha^n es.h se trouve la d nition d'une telle valeur qui porte le nom de NULL. Dans le chier d'include stddef. a 5. Un certain nombre de e fonctions de la biblioth.

il est n cessaire avant tout acc.2 Ouverture et fermeture de chiers 5.1 Ouverture d'un chier : fopen Lorsqu'on d sire acc der a un chier. utilisent la valeur e NULL comme indicateur d'erreur.que standard qui doivent rendre un pointeur. 5.2.

s d'ouvrir le chier e e .

e e a .

l'aide de la fonction fopen. Utilisation fopen nom-de- chier . mode S mantique des param.

e 81 .tres e e nom-de.chier est de type pointeur vers char. La cha^ne point e est le nom du chier e auquel on veut acc der.

e .mode est de type pointeur vers char. e "a" ouverture d'un chier texte en criture a la n. e elle peut ^tre l'une des cha^ne suivantes : e "r" ouverture d'un chier texte en lecture. "w" ouverture d'un chier texte en criture. La cha^ne point e indique le mode d'ouverture.

"rb" ouverture d'un chier binaire en lecture. "wb" ouverture d'un chier binaire en criture. e "ab" ouverture d'un chier binaire en criture .

la n. e a "r+" ouverture d'un chier texte en lecture criture. e "w+" ouverture d'un chier texte en lecture criture. e "a+" ouverture d'un chier texte en lecture criture .

e "a+b" ou "ab+ ouverture d'un chier binaire en lecture criture . e a "r+b" ou "rb+ ouverture d'un chier binaire en lecture criture. e "w+b" ou "wb+ ouverture d'un chier binaire en lecture criture. la n.

la n. e a Remarque La fonction fopen a t normalis e en ayant pr sent .

l'esprit ee e e a que certains syst.

mes font la distinction entre chiers binaires et e chiers textes. Cette distinction n'a pas cours dans le syst.

o. Valeur rendue La fonction fopen retourne une valeur de type pointeur vers FILE.me e unix.

FILE est un type u pr d ni dans le chier stdio. et devra ^tre e e e e pass e en param. ee Si l'ouverture a r ussi. la valeur retourn e permet de rep rer le chier.h.

tre a toutes les proc dures d'entr es-sorties sur le chier. e e .

fopen rend la valeur NULL. e e Si l'ouverture s'est av r e impossible. ee Conditions particuli.

Si le mode contient la lettre w. le chier peut. sinon c'est une erreur. le chier doit exister. Si le chier n'existe pas. il est cr . exister. ou peut ne pas.res et cas d'erreur e Si le mode contient la lettre r. si le chier existe d j.

si le chier existe d j. son ancien contenu est perdu. Si le chier n'existe pas. le chier peut. ou peut ne pas.. exister. il est cr . ee ea Si le mode contient la lettre a.

son ancien contenu est conserv . ee ea e Si un chier est ouvert en mode  criture ..

la n . toutes les critures se font .

r sultat de l'ouverture e e d'un chier en criture . Cela e e signi e que si plusieurs processus partagent le m^me FILE *. e a e a l'endroit qui est la n du chier au moment de l'ex cution de l'ordre d' criture.

la n. e a e e D'autre part. fait un fseek pour e . si un processus ouvre un chier en criture a la n. leurs critures ne s' craseront pas mutuellement.

se positionner a un endroit du chier. puis fait une criture. celle-ci aura lieu a la n .

e .

du chier pas n cessairement .

e a 82 . l'endroit du fseek.

Les voies de communication standard Quand un programme est lanc par le syst.

h de type pointeur vers ee FILE qui rep. standard output et standard error. celui-ci ouvre trois chiers correse e pondant aux trois voies de communication standard : standard input.me. Il y a trois constantes pr d nies dans stdio.

if fp = fopen"donnees". Utilisation typique de fopen include stdio.rent ces trois chiers.2 fermeture d'un chier : fclose Quand on a termin les E S sur un chier. il faut en informer le syst."Impossible d'ouvrir le fichier donn es en lecture n"."r" == NULL fprintfstderr.2.h FILE *fp. e exit1. stdout et e stderr. Elles ont pour nom respectivement stdin. 5.

me a l'aide de la e e .

fonction fclose. Utilisation fclose  ot-de-donn es e S mantique des param.

Il pointe vers le chier a fermer. e .tres e e ot-de-donn es est de type pointeur vers FILE.

h fclosef. 83 . Utilisation typique include FILE *f. Valeur rendue La fonction fclose rend la valeur z ro si le chier a t ferm . et rend EOF si il y a eu e ee e une erreur. stdio.

3 Lecture et criture par caract.5.

3.re sur chier e e 5.1 lecture par caract.

re : fgetc e Utilisation fgetc  ot-de-donn es e S mantique des param.

Il pointe vers le chier a partir duquel e .tres e e ot-de-donn es est de type pointeur vers FILE.

se fait la lecture. Description La fonction fgetc lit un caract.

e e Valeur rendue Si la lecture se fait sans erreur et sans rencontre de la n de chier.re du chier ot-de-donn es. fgetc rend le caract.

Utilisation typique include stdio. Pour cette raison.2 lecture par caract. FILE *fi. le type de la valeur rendue est int et non pas char.. fgetc rend la e e valeur EOF.h int c. while c = fgetcfi != EOF .3. Si il y a erreur d'entr e-sortie. ou rencontre de n de chier. * utilisation de c * 5..re lu.

re : getc e Il existe une fonction getc qui est rigoureusement identique .

a e m^me s mantique. La di rence est que getc peut valuer plusieurs fois son param. sauf que getc est impl ment comme une macro et non comme une e e e e vraie fonction C. fgetc m^me interface.

ce qui lui interdit d'^tre une expression contenant des e ets de bord.. c = getcTAB_FILE i++ . effet de bord ! * 84 . * Arrgh. FILE * TAB_FILE 10 . e e Exemple : int i..tre e e e ot-de-donn es..

3.3 lecture par caract.5.

re : getchar e Utilisation getchar   Description La fonction getchar est rigoureusement quivalente .

mais comme elle n'admet pas de param. getcstdin. C'est galement e a e une macro.

3.4 criture par caract. elle n'a pas le petit inconv nient e e de getc. 5.tre.

re : fputc e e Utilisation fputc carac . ot-de-donn es e S mantique des param.

c'est le caract.tres e e carac est de type int.

re .

crire. Il pointe vers le chier sur lequel se e fait l' criture. e ae ot-de-donn es est de type pointeur vers FILE. e Description La fonction fputc crit le caract.

e e e Valeur rendue La fonction fputc rend le caract.re carac dans le chier ot-de-donn es.

* * fi : r sultat de fopen de fichier en lecture e fo : r sultat de fopen de fichier en criture e e * * while c = fgetcfi != EOF fputcc. Utilisation typique include stdio.*fo.h int c. 85 .fo.re crit si l' criture s'est faite sans erreur. FILE *fi. ou EOF en e e e cas d'erreur.

5 criture par caract.3.5.

re : putc e e Il existe une fonction putc qui est rigoureusement identique .

fputc m^me interface. sauf que putc est impl ment comme une macro et non comme une e e e e vraie fonction C. La m^me remarque que celle faite au sujet de getc s'applique donc . a e m^me s mantique.

3.6 criture par caract. 5. e a putc.

re : putchar e e Utilisation putchar carac Description Un appel putcharc est rigoureusement identique .

4.stdout. taille . a 5.1 lecture par ligne : fgets Utilisation fgets cha^ne .4 Lecture et criture par lignes sur chier e 5. ot-de-donn es e S mantique des param. fputcc.

tres e e cha^ne est de type pointeur vers char et doit pointer vers un tableau de caract.

res. e taille est la taille en octets du tableau de caract.

res point par cha^ne. e e ot-de-donn es est de type pointeur vers FILE. Il pointe vers le chier a partir duquel e .

Attention Sur n de chier ou erreur. fgets rend NULL et non pas EOF. Description La fonction fgets lit les caract.. Valeur rendue La fonction fgets rend le pointeur cha^ne cas de lecture sans erreur. Grrr . ou NULL dans le cas de n de chier ou d'erreur.. se fait la lecture.

res du chier et les range dans le tableau point par e e cha^ne jusqu'.

rencontre d'un line-feed qui est mis dans le tableau. ou rencontre de n de a chier. ou jusqu'.

ce qu'il ne reste plus qu'un seul caract.

re libre dans le tableau. fgets a e compl.

te alors les caract.

res lus par un caract.

re null. e e e 86 .

while fgetsligne... char ligne LONG .2 lecture par ligne : gets Utilisation gets cha^ne S mantique des param.4.. * utilisation de ligne * * stop sur fin de fichier ou erreur * 5.. FILE *fi.Utilisation typique include stdio.LONG.h define LONG .fi != NULL .

tres e e cha^ne est de type pointeur vers char et doit pointer vers un tableau de caract.

e Valeur rendue gets rend NULL dans le un pointeur vers le tableau de caract.res.

Malheureusement. Description La fonction gets est un fgets sur stdin avec la di rence que le line feed n'est pas e mis dans cha^ne. ou e cas de n de chier ou d'erreur.res en cas de lecture sans erreur. l'interface de gets est une catastrophe : il n'a pas le param.

tre taille qui donne la taille du tableau point par cha^ne. Ceci interdit donc .

e e Pour cette raison l'usage de gets est tr. gets e e a toute v ri cation pour ne pas d border du tableau.

ot-de-donn es e S mantique des param.s fortement d conseill 1 e e e 5.4.3 criture par cha^ne : fputs e Utilisation fputs cha^ne .

Pointe vers un tableau de caract.tres e e cha^ne est de type pointeur vers char.

L'attaque d'Internet connue sous le nom de  the Internet worm  a pro t de la pr sence dans le e e syst.res contenant e une cha^ne se terminant par un null. 1.

e e 87 .me d'un d mon qui utilisait gets.

e Valeur rendue EOF La fonction fputs rend une valeur non n gative si l' criture se passe sans erreur.ot-de-donn es est de type pointeur vers FILE. Description sur le chier le contenu du tableau dont la n est indiqu e par un caract. et e e en cas d'erreur. Il pointe vers le chier sur lequel se e fait l' criture.

re e e null. Le tableau de caract.

res peut contenir ou non un line-feed. e . fputs peut donc servir e indi remment a crire une ligne ou une cha^ne quelconque.

h define LONG . char ligne LONG .e fputs crit e Utilisation typique include stdio.fo. FILE *fo. 5. fputsligne.4..4 criture par cha^ne : puts e Utilisation puts cha^ne S mantique des param..

tres e e cha^ne est de type pointeur vers char. Pointe vers un tableau de caract.

on peut donc l'utiliser. Valeur rendue EOF La fonction fputs rend une valeur non n gative si l' criture se passe sans erreur.res contenant e une cha^ne se terminant par un null. Elle n'est pas entach du m^me vice r de e e hibitoire que gets. et e e en cas d'erreur. 88 . Description La fonction puts est un fputs sur stdout.

5.1 Ecriture formatt e : fprintf e Utilisation La fonction fprintf admet un nombre variable de param.5 E S formatt es sur chiers e 5.5.

. Son utilisation est la e suivante : fprintf  ot-de-donn es . param 2 .tres. param 1 . .. param n  e S mantique des param. format . .

e format est une cha^ne de caract. Il pointe vers le chier sur lequel se e fait l' criture.tres e e ot-de-donn es est de type pointeur vers FILE.

e e e e param i est une expression d livrant une valeur .res qui sp ci e ce qui doit ^tre crit.

e ae Valeur rendue La fonction fprintf retourne le nombre de caract. crire.

e Pr sentation e La cha^ne format contient des caract. ou une valeur n gative si e e e il y a eu une erreur d'entr e-sortie.res crits.

res ordinaires c'est a dire di rents du caract.

re e .

et des s quences d' chappement introduites par le e e e e caract. e e  qui doivent ^tre copi s tels quels.

d crivant la mani.re .

re dont doivent ^tre crits les param.

. e e e e e e . Si il y a moins de param i que n'en r clame le format. e e Si il y a davantage de param i que n'en n cessite le format. param 2 . le comportement n'est pas d ni.tres param 1 .. les param i en exc. param n .

e Les s quences d' chappement e e Une s quence d' chappement se compose des l ments suivants : e e ee 1 Un certain nombre  ventuellement z ro d'indicateurs pouvant ^tre les caract. e e e e mais leur valeur est ignor e.s sont valu s.

res e e e e suivants : + blanc param i sera cadr .

il sera imprim pr c d du signe + ou e e eee -. gauche dans son champ d'impression. ea si param i est un nombre sign . si param i est un nombre sign et si son premier caract.

on imprimera un blanc devant param i . Si on a .re n'est pas e e un signe.

e 89 . ce dernier sera ignor . la fois a l'indicateur + et l'indicateur blanc.

Pour le format o. cet indicateur force la pr cision . cet indicateur demande l'impression de param i sous une forme non standard.

^tre e ae augment e de mani.

re a ce que param i soit imprim en commenant e e .

Pour les formats x et X. cet indicateur a pour but de e faire pr c der param i respectivement de 0x ou 0X. e c par un z ro. Pour les formats e. E. cet indicateur force param i . g et G. f. sauf si param i est ee nul.

a ^tre imprim avec un point d cimal. m^me si il n'y a aucun chi re e e e e apr.

u. Pour les formats g et G. f. i. e pour les formats d. et G cet indicateur a pour e et de compl ter l' criture de param i avec des 0 en t^te. E. g. de mani. o.s. X. x. e. cet indicateur emp^che les z ros de la e e e n d'^tre enlev s. le comportement n'est pas e e d ni. Pour les autres formats.

re e e e e a .

Si il y a . ce qu'il remplisse tout son champ d'impression.

l'indicateur 0 e est ignor . le comportement n'est pas d ni. x et X. la fois les a deux indicateurs 0 et -. si il y a une indication de pr cision. Pour les autres formats. i. l'indicateur 0 sera ignor . o. u. e e 0 2 Un nombre entier d cimal optionnel indiquant la taille minimum du champ e d'impression. Pour les formats e d. exprim e en caract.

res. Si param i s' crit sur un nombre de carace e e t.

res inf rieur .

param i est compl t . cette taille.

droite ou .

i. le nombre de chi res apr. o. comme il a t e ee expliqu plus haut. e Une indication optionnelle de pr cision. u. avec des blancs ou des 0. gauche selon que e e a eea a l'on aura utilis ou pas l'indicateur -. qui donne : e 3 le nombre minimum de chi res pour les formats d. x et X.

s le point d cimal pour les formats e. e e le nombre maximum de chi res signi catifs pour les formats g et G le nombre maximum de caract. E et f.

la pr cision est prise gale . suivi d'un nombre e d cimal optionnel. e Cette indication de pr cision prend la forme d'un point . Si ce nombre est omis.res pour le format s.

0. e e e a 90 .

peuvent ^tre remplac es par le caract.Remarque Le nombre entier d cimal indiquant la taille maximum du e champ d'impression et ou le nombre entier d cimal indiquant e la pr cision.

Si le e e e e caract.re *.

la valeur e ee e correspondante taille du champ ou pr cision sera prise gale e e a .re * a t utilis une seule fois dans le format.

param i.1 . Si le caract.

la taille du e ee e champ d'impression sera gale .re * a t utilis deux fois.

et la pr cision sera e a e gale a parami. Si la taille maximum du champ d'impression e . param i.2 .1 .

a une valeur n gative. Si la pr cision est n gative. 4 un caract. cela a la s mantique d'une pr cision e e e e absente. cela a la s mantique de l'indicateur e e suivi de la valeur positive de la taille du champ d'impression.

qui peut ^tre : e e h h l l L s'appliquant aux formats d. f. x ou X : param i sera interpr t ee comme un short int ou unsigned short int.re optionnel. i. s'appliquant au format n : param i sera interpr t comme un pointeur ee vers un short int. u. u. o. g ou G : param i sera interpr t ee comme un long double. x ou X : param sera interpr t ee i comme un long int ou un unsigned long int. E. 2 . s'appliquant aux formats d. 3 s'appliquant au format n : param sera interpr t comme un poinee i teur vers un long int. s'appliquant aux formats e. 5 Si un h. o. i. l ou L s'applique .

e e un caract. un autre format que ceux indiqu s a e ci-dessus. le comportement est ind termin .

La notation hexad cimale utilisera les lettres abcdef e e dans le cas du format x. 2. X param i sera interpr t comme un int. i u o x. la lettre elle. et crit sous forme ee e d cimale non sign e.re qui peut prendre les valeurs suivantes : e d. e param i sera interpr t comme un unsigned int. m^me remarque e 91 . et crit sous forme hexad ciee e e male non sign e. et crit sous forme d cimale ee e e sign e. e param i sera interpr t comme un int. e e param i sera interpr t comme un int. pas le chi re un 3. et crit sous forme octale non ee e sign e. et les lettres ABCDEF dans le cas du format X.

Dans les cas qui pr c.

il sera come e pl t avec des z ros. ne sera pas imprim e. la pr cision indique le nombre minimum de chi res ee e avec lesquels crire param i . e e c s p n e.G  param i sera interpr t comme un unsigned char. Une valeur nulle demand e ee e e e e avec une pr cision nulle.E f g. Si param i s' crit avec moins de chi res.dent. ee param i sera interpr t comme l'adresse d'un tableau de caract. La pr cision par d faut est 1.

Les caract.res ee e termin ou non par un null.

res du tableau seront ime e prim s jusqu'au premier des deux v.

nements possibles: e ee impression de pr cision caract.

e e rencontre de null dans param i . Dans le cas o.res de param i .

param i n'est pas termin par un null. le format d'imu e pression doit comporter une indication de pr cision. e param i sera interpr t comme un pointeur vers void. e e e param i sera interpr t comme un pointeur vers un int auquel sera ee a ect le nombre de caract. Le pointeur ee sera imprim sous une forme d pendante de l'impl mentation.

param i sera interpr t comme un double et crit sous la forme : ee e -option pe . pf e signe exposant dans laquelle pe et pf sont respectivement partie enti.res crits jusqu'alors par cette invocation e e e de fprintf.

La partie enti.re et partie frace tionnaire de la mantisse.

la partie fractionnaire est exprim e avec un nombre de chi res e gal .re est exprim e avec un seul e e chi re.

la pr cision. La pr cision est prise gale .

L'exposant contient e e toujours au moins deux chi res. l'exposant sera nul. Si la e a e e e a e pr cision est 0. Dans le cas du format E. la lettre E est imprim e a la place de e. 6 par d faut. le point d cimal n'appara^t pas. Si param i est nul. e .

param i sera interpr t comme un double et crit sous la forme : ee e -option pe . pf dans laquelle pe et pf sont respectivement partie enti.

La partie fractionnaire est exprim e avec e un nombre de chi res gal .re et partie e fractionnaire de la mantisse.

La pr cision est prise gale e a e e e a . la pr cision.

le point d cimal n'appara^t pas. 6 par d faut. Si param i a un exposant inf rieur . selon sa valeur. ou ee e le format e. e e e param i sera interpr t comme un double et crit sous le format f. Si la pr cision est 0.

il sera imprim sous le format e. -4 e a ou plus grand ou gal a la pr cision. e .

D' ventuels z ros . e e sinon il sera imprim sous le format f.

la n de e e e a la partie fractionnaire sont enlev s. Dans ce qui pr c. Le point d cimal n'appara^t que e e si il est suivi d'au moins un chi re.

de. l'utilisation ee du format G implique l'utilisation du format E .

la place du format a e. Un caract.

re  est crit.2 Ecriture formatt e : printf e Nous avons d j.5. e e 5.

mais nous allons la d nir ici formellement. ea e 92 . vu printf.

Utilisation La fonction printf admet un nombre variable de param.

 est rigoureusement identique a fprintfstdout.. param 2 . param 1 ..fmt. . .tres. ..... Son utilisation est la e suivante : printf  format ... . param n  Description Un appel printffmt.

3 Ecriture formatt e dans une cha^ne : sprintf e Utilisation La fonction sprintf admet un nombre variable de param. 5.5.

. avec la dife e f rence que les caract. param n  Description La fonction sprintf r alise le m^me traitement que la fonction fprintf. .. .tres. param 1 . param 2 . format . Son utilisation est la e suivante : sprintf  cha^ne .

mais dans e e e e le tableau de caract.res mis par sprintf ne sont pas crits dans un chier.

res cha^ne. Un null est crit dans cha^ne en n de traitement. e e 93 .

-1234. printf"|x| n".234567890123456789e5.234568e+05| |1. printf"|x| n".79| 5.78901234567456413060| | 123456.7890| |123456. printf"|X| n". printf"|.234567890123456789e5.4g| printf"|.1. printf"|.-1234. printf"|*.7890| |1.2346e+05| |1.234567890123456789e5. printf"|+d| n".1234.1. printf"|. printf"| d| n".234567890123456789e5.234567890123456789e5.5.4g| printf"|. printf"|f| n".1234.6d| n". printf"|e| n".234567890123456789e5.4 Exemples d'utilisation des formats source C printf"|d| n".235e+05| |0.789012| |123456.1.1.6d| n".1.001235| |123456.8g| n".1.1234. printf"|10.0x56ab. printf"|o| n". printf"|.20f| n".20e| n". printf"|10d| n".0x56ab.2346e+05| |1.4e| n".5 Entr es formatt es : fscanf e e Utilisation La fonction fscanf admet un nombre variable de param. printf"|20. printf"|.1234.10.1. resultat |1234| |-1234| |+1234| |-1234| | 1234| |-1234| |56ab| |56AB| |0x56ab| |0X56AB| |2322| |02322| | 1234| | 001234| |001234| | 001234| | 001234| |123456.234567890123456789e-3.4e| n".6d| n".1234. printf"|X| n".234567890123456789e5.1234.234567890123456789e5.4f| n".1.1234.4g| printf"|. printf"|*. printf"| d| n".10. n". n".6.*d| n".5.234567890123456789e5. printf"|+d| n".-1234.1.1. printf"|20.0x56ab. printf"|.1234.4f| n".1234. printf"|d| n".1234.234567890123456789e5.234567890123456789e-5.235e-05| |1.5.0x56ab.23456789012345674564e+05| | 1.1. printf"|o| n".1. n".

Son utilisation est la e suivante : fscanf  ot-de-donn es . param 1 . . param n  e S mantique des param. format ..tres. param 2 . ..

Il pointe vers le chier a partir duquel e .tres e e ot-de-donn es est de type pointeur vers FILE.

94 . se fait la lecture.

format est une cha^ne de caract.

Ils pointent des variables dans lesquelles fscanf d pose e les valeurs lues dans ot-de-donn es.res qui sp ci e la forme de l'entr e admissible dans e e e ot-de-donn es. e les param i sont des pointeurs. apr.

s les avoir converties en binaire. Si il y a eu rencontre de n de chier ou erreur d'entr e-sortie avant toute e e a ectation . fscanf retourne le nombre de parami a ect s. e e Valeur rendue Si au moins un parami s'est vu a ecter une valeur.

un parami . a Description fscanf lit une suite de caract. fscanf retourne EOF.

res du chier d ni par ot-de-donn es en v ri ant que e e e e cette suite est conforme .

la description qui en est faite dans format. Cette v ri cation a e s'accompagne d'un e et de bord qui consiste a a ecter des valeurs aux variables point es .

e par les di rents param i . e Quelques d nitions e ot d'entr e il s'agit de la suite de caract.

e e e e caract.res lus du chier d ni par ot-de-donn es.

res blancs il s'agit des six caract.

res suivants : espace. tab. d mod. new line. line feed. e e vertical tab et form feed.

le un mod.

le est la description d'un ensemble de cha^nes de caract.

res. Exemple : e e e est le mod.

ventuellement sign es. e e e e e 123 conforme on dira qu'une cha^ne est conforme .le des cha^nes form es de chi res d cimaux.

un mod.

le quand elle appartient .

l'en a e a semble des cha^nes d crites par le mod.

le. est conforme au mod. Exemple : e e d.

le e directive une directive peut ^tre : e une suite de caract.

res blancs qui est un mod.

le d'un nombre quelconque de e e caract.

res blancs. Exemple : un espace est un mod.

ou d'un nombre quelconque d'espace et de tab m lang s. de tab et de line-feed m lang s etc.le pour un nombre quele e conque d'espaces. ou e e d'un nombre quelconque d'espaces. e e une suite de caract.

res ordinaires c'est .

dire qui ne sont ni des caract.

res e a e blancs. ni le caract.

re  qui est un mod.

Exemple : la cha^ne e e e hello est un mod.le pour elle-m^me.

e des s quences d' chappement introduites par le caract.le de la seule cha^ne hello.

re . Ces s quences e e e e jouent un double r^le : elle sont .

la fois un mod.

et elles sont galement des ordres de conversion de la cha^ne lue e e et d'a ectation du r sultat .le des cha^nes acceptables dans o a e le ot d'entr e.

une variable point e par le parami correspondant. e a e Exemple : la directive d est un mod.

le des nombres d cimaux et un ordre de e e conversion de la cha^ne lue en valeur binaire et d'a ectation .

l'entier point a e par le parami correspondant. 95 .

Les s quences d' chappement e e Les s quences d' chappement se composent des l ments suivants : e e ee 1 le caract.

re * optionnel qui indique que la directive doit ^tre consid r e comme e e ee un pur mod.

le : pas de conversion de la cha^ne lue. et pas d'a ectation .

2 un nombre optionnel qui indique la longueur maximum de la cha^ne acceptable du ot d'entr e. un e a parami . e 3 un caract.

g : parami pointeur vers un double. s'appliquant aux formats o. i. qui est un modi cateur de type. s'appliquant aux formats d. s'appliquant aux formats e. u. pouvant prendre l'une e des valeurs suivantes : h h l l l L s'appliquant aux formats d. s'appliquant aux formats o. x : parami pointeur vers un unsigned long int. i.re optionnel. f. g : parami pointeur vers un long double. x : parami pointeur vers un unsigned short int. f. u. s'appliquant aux formats e. n : parami pointeur vers un long int. sera interpr t comme un ee sera interpr t comme un ee sera interpr t comme un ee sera interpr t comme un ee sera interpr t comme un ee sera interpr t comme un ee 4 un caract. n : parami pointeur vers un short int.

re de conversion qui peut prendre l'une des valeurs suivantes : e d i o u mod.

e e e eee Le parami correspondant est interpr t comme un pointeur vers un ee int. mod.le pour un nombre d cimal ventuellement pr c d d'un signe. sauf si la directive contient un modi cateur de type.

qui sera pris comme nombre e hexad cimal.le pour un nombre ventuellement pr c d d'un signe. sauf si la directive contient un modi cateur de type. e un nombre d butant par 0 qui sera pris comme nombre octal. e un nombre d butant par 0x ou 0X. et ayant e e eee l'une des trois formes suivantes : un nombre d cimal. mod. e Le parami correspondant est interpr t comme un pointeur vers un ee int.

e e eee Le parami correspondant est interpr t comme un pointeur vers un ee unsigned int. sauf si la directive contient un modi cateur de type.le pour un nombre octal ventuellement pr c d d'un signe. mod.

sauf si la directive contient un modi cateur de type. 96 4. dans le ot d'entr e. et pas seulement +. le nombre e peut ^tre pr c d d'un signe.le pour un nombre d cimal ventuellement pr c d d'un signe. Non. 4 e e e eee Le parami correspondant est interpr t comme un pointeur vers un ee unsigned int. d'ailleurs ! e eee . il n'y a pas d'erreur : bien que ce format soit pour des unsigned.

x mod.

Remarque i c s e.f. Le parami correspondant est interpr t comme un pointeur ee vers un unsigned int. sauf si la directive contient un modi cateur de type.le pour un nombre hexad cimal ventuellement pr c d d'un e e e eee signe.g p n mod.

le pour une suite de caract.

il est pris gal . Si ce nombre optionnel ne e gure pas dans la directive.res dont le nombre est donn par e e e le nombre optionnel qui indique la longueur maximum de la cha^ne acceptable du ot d'entr e Cf plus haut.

Le parami correse a pondant est interpr t comme tant un pointeur vers un tableau de ee e caract. 1.

Il n'y a e pas de null rajout .res su samment grand pour contenir la cha^ne lue.

ea e mod. la n de la cha^ne lue dans le ot d'entr e.

le pour une suite de caract.

Le parami correspone e dant est interpr t comme un pointeur vers un tableau de caract.res non blancs.

res ee e su samment grand pour contenir la cha^ne lue plus un null terminal. mod.

le pour un ottant crit selon la syntaxe d'une constante ote e tante du langage C. Dans la cha^ne format. Le parami correspondant est interpr t comme un ee pointeur vers un float . ce caract. sauf si la directive contient un modi cateur de type.

re introduit une s quence particu e e li.

re destin e .

La s quence est form e du caract. d nir un scanset.

re e e a e e e e . suivi d'une suite de caract.

res quelconques. suivi du caract.

Si e e le premier caract.re .

re apr.

s le crochet ouvrant n'est pas le caract.

e e e le scanset est l'ensemble des caract.re ^.

res entre crochets. Si le caract.

re e e apr.

s le crochet ouvrant est le caract.

re ^. le scanset est l'ensemble e e des caract.

Le e scanset peut comprendre le caract.res ne se trouvant pas dans la cha^ne entre crochets.

re .

.. Le scanset peut contenir ^ .. selon que l'on utilise la forme sans e ou avec ^. ou ^ .. condition de le mettre en e a d but soit .

.^. condition de ne pas le mettre a en t^te : ... e Une directive est un mod.. .

le pour une suite de caract.

Le parami correspondant est interpr t comme ee un pointeur vers un tableau de caract.res appare e tenant au scanset.

mod.res su samment grand pour e contenir la cha^ne lue plus un null terminal.

le pour un pointeur crit d'une mani.

re d pendant de l'impl e e e e e mentation. mais identique .

l'impression par printf d'un pointeur a selon le format p. Le parami correspondant est interpr t comme un ee pointeur vers un pointeur vers void. cette directive n'est pas un mod.

le. Elle ne sert qu'.

u. mettre une e a valeur dans l'objet point par le parami correspondant. le lecteur a sans doute t surpris de voir que le param correspondant est interpr t ee ee comme un pointeur vers un unsigned int alors que la cha^ne dans le ot d'entr e qui correspond . Le parami e 97 En ce qui concerne les formats o. et x.

c'est e ee e bien ce que dit la norme. Il n'y a pas d'erreur. . ces formats est un nombre e a ventuellement pr c d d'un signe.

 correspondant est interpr t comme un pointeur vers un int dans ee lequel fscanf crit le nombre de caract.

res lus jusqu'.

5. L'ex cution e e d'une directive n n'augmente pas le nombre des parami a ect s qui e sera retourn par fscanf Cf 5. par cette invocation de fscanf. e est un mod. e e a dans le ot de donn es. ce moment.5.

le pour le caract.

re . La directive compl.

le comportement n'est pas d ni.te est . les parami en exc. Si il n'y a pas su samment de parami pour le format. Il doit y avoir autant de parami que de directives demandant l'a ectation d'une valeur. Si il y a davantage de parami e que demand par le format. e e e Algorithme de fscanf La cha^ne format doit se composer d'un ensemble de directives.

Si une directive e choue.s sont valu s mais ils sont inutilis s. e . e e e e e La fonction fscanf ex cute dans l'ordre chaque directive du format. la fonction fscanf retourne a l'appelant.

L'ex cution d'une directive form e de caract.

res blancs. consiste .

consommer dans e e e a le ot d'entr e la plus longue s quence possible de caract.

res blancs. la directive a r ussi. e e L'ex cution d'une directive form e de caract. M^me si cette e e e e s quence est de taille nulle.

res ordinaires. consiste .

consommer e e e a dans le ot d'entr e une s quence identique .

la directive. Au premier caract.

re e e a e di rent. la directive a chou et ce caract.

consiste .re reste non lu. e e e e L'ex cution d'une directive form e d'une s quence d' chappement.

: e e e e a 1. consommer dans le ot d'entr e la plus longue s quence possible de caract.

consommer dans le ot d'entr e la plus longue s quence possible de caract. 2. ni . Cette action ne s'applique pas e e aux formats c. Cette s quence peut ^tre de taille nulle.res e e e blancs. n.

res e e e qui soit conforme au mod.

Si cette s quence est de taille nulle.le. si la directive ne contient pas le caract. e e 3. la directive a e e chou .

re *. convertir la cha^ne lue et l'a ecter e a .

l'objet point par le parami correspondant. le format contient une directive form e de caract. le comportement n'est pas d ni. Si cet objet n'est pas de la taille e ou du type convenable pour la recevoir. e Remarques sur la gestion des espaces blancs La gestion des espaces blancs est assez p nible. Il y a deux m thodes de consommation e e des espaces blancs du ot de donn es : e 1.

res blancs. Si une telle directive ne e e peut consommer aucun caract.

le format contient une s quence d' chappement autre que c.re blanc. e e 2. c'est un cas d' chec de la directive. ou  dont l'ex cution e e e commence par consommer d' ventuels caract. n.

Si e e e il n'y a pas de caract.res blancs dans le ot de donn es.

res blancs .

ce n'est pas une condition d' chec de e a e la directive. 98 . consommer.

Voyons quelques cons quences. e Si le ot de donn es contient 23 e 45 on pourra les lire indi remment soit : e par le format "d d" : la premi.

la directive blanc e entre les deux d consomme les blancs entre 2 et 45. choue mais ce n'est pas une erreur.re directive d consomme 23. e par le format "dd" : la premi. puis consomme 45. et la seconde directive d essaye de consommer des blancs.

la seconde directive e d essaye de consommer des blancs. e e Un tel ph nom. r ussit. puis consomme 45. les valeurs a ect es seront bien les m^mes : 23 et 45.re directive d consomme 23. e Dans les deux cas.

Par exemple.ne ne se manifeste pas avec les s quences d' chappement dont l'ex cue e e e e tion ne commence pas par consommer les espaces blancs. si le ot de donn es e contient 23 jean dupond. on n'obtiendra pas le m^me r sultat selon que l'on utilise le e e format "d  abcdefghijklmnopqrstuvwxyz " ou le format "d abcdefghijklmnopqrstuvwxyz " sans blanc apr.

s d. mais dans le premier cas. Le fscanf r ussira dans e e les deux cas.5. la cha^ne a ect e au parami sera "jean dupond" e et dans le second cas. 5. ce sera " jean dupond".6 Entr es formatt es : scanf e e Nous avons d j.

nous allons la d nir ici formellement. vu scanf. ea e Utilisation La fonction scanf admet un nombre variable de param.

. . est rigoureusement identique . param 1 .. Son utilisation est la e suivante : scanf  format .. ..tres. param 2 .. param n  Description Un appel scanffmt.

. fscanfstdin.. a 5..5.fmt..7 Entr es formatt es depuis une cha^ne : sscanf e e Utilisation La fonction sscanf admet un nombre variable de param.

. . avec la di rence e e e que les caract. Son utilisation est la e suivante : sscanf  cha^ne . param 1 . format . param 2 .tres. . param n  Description La fonction sscanf r alise le m^me traitement que la fonction fscanf..

res lus par sscanf ne sont pas lus depuis un chier. mais du tableau de e caract.

La rencontre du null terminal de cha^ne pour sscanf est quivalent .res cha^ne.

e e a la rencontre de n de chier pour fscanf. 99 .

5. Ce n'est pas facile du tout de cr er un tel e e programme si on exclut la version triviale consistant .6 R cr ation e e En illustration du printf et en guise de r cr ation. je propose un programme dont e e l'ex cution imprime le source du programme.

p. le lire a et l'imprimer.p.34.7 Exercice 1 Soit un chier de donn es structur en une suite de lignes contenant chacune un nom e e de personne. un nom de pi.34.printfp.printfp.34.34. Voici une solution possible que l'on trouve dans le source du compilateur gnu c : main char*p="main char*p=csc. faire un open sur le source. Une indication pour le comprendre : 34 est le code ascii de " et 10 est le code ascii de newline. c".10.10. 5.

Exemple : e dupond vilebrequin 10 1000 crire une proc dure main dans laquelle on d clarera les variables suivantes : e e e nom et article : tableaux de 80 caract. un nombre et un prix.ce.

res e nombre et prix : entiers le corps de la proc dure consistera en une boucle dont chaque it ration lira une ligne e e et l'imprimera. la lecture d'une ligne se fera par un appel a scanf a ectant les 4 champs de la ligne .

article. nombre et prix. l' criture consistera . aux 4 variables nom.

et une continuation de la boucle de calcul. article et le produit nombreprix. imprimer nom. Si l'utilisateur tape une ligne incorrecte. e a 5. on d sire l' mission e e d'un message d'erreur.8 Exercice 2 Reprendre la calculette r alis e en n de chapitre sur les pointeurs et y rajouter une e e gestion correcte des erreurs. 100 .

data".article.nombre * prix. char article 80 . char nom 80 . fclosefi.include "stdio."s s d d".nom.&prix != EOF printf"s s d n".&nombre. 101 . int nombre.data n".prix.article."r" == NULL printf"Impossible d'ouvrir le fichier exer6. if fi = fopen"exer6.nom.h" ***************************************************************************** * * * main * * * ***************************************************************************** int main FILE * fi. else whilefscanffi.

&i.h FAUX.c.buf_err.buf_err.j.include enum stdio. break. break. imp = VRAI.&c. default : printf"l'op rateur c est incorrect n".&j != 3 if ret == EOF exit0. break. * on mange la partie erron e e printf"Erreur de syntaxe : s n". char imp. scanf" ^ n ". imp = FAUX. VRAI .j.r. 0 * les op randes * e * l'op rateur e * * bool en de demande d'impression du r sultat e e * code de retour de scanf * 80 . = i * j. * * printf"Division par z ro n". char buf_err while 1 if ret = scanf"d c d". ***************************************************************************** * * * main * * * ***************************************************************************** int main int i. 102 . case '' : r = i  j. char c. int ret. e imp = FAUX.r. break. e * fin du switch * if imp printf"d n". = i . break. else r = i j. switch c case '+' : r case '-' : r case '*' : r case ' ' : if  j == = i + j. continue.

On travaille e e e par exemple sur un chier de personnes et on voudrait regrouper une variable de type cha^ne de caract.Chapitre 6 Structures. unions et num rations e e 6.1 Notion de structure Il est habituel en programmation d'avoir besoin d'un m canisme permettant de grouper e un certain nombre de variables de types di rents au sein d'une m^me entit .

une variable de type entier pour le num ro d'employ . etc.res pour le nom. e e e La r ponse .

Les l ments d'un enregistrement sont ee e ee ee appel s des champs. Le langage C poss. ce besoin est le concept d'enregistrement : un enregistrement est un ensemble e a d' l ments de types di rents rep r s par un nom.

de le concept d'enregistrement avec cependant un e e probl.

2 D claration de structure e Il y a plusieurs m thodes possibles pour d clarer des structures. e e Premi.me de vocabulaire : e ce que tout le monde appelle le langage C l'appelle enregistrement structure champ d'un enregistrement membre d'une structure 6.

char prenom 20 .re m thode e e La d claration : e struct personne char nom 20 . dont le premier est un tableau de 20 caract. int no_employe. d clare l'identi cateur personne comme tant le nom d'un type de structure compos e e e e de trois membres. .

le second e e un tableau de 20 caract.res nomm nom.

de la mani. e e e Dans le jargon du langage C. On e peut ensuite utiliser ce type structure pour d clarer des variables. l'identi cateur personne est une tiquette de structure. et le dernier un entier nomm no_employe.res nomm prenom.

103 .p2.re suivante : e e struct personne p1.

Deuxi.qui d clare deux variables de type struct e personne de noms p1 et p2.

char prenom 20 . e e mais elle ne donne pas de nom au type de la structure. d clare deux variables de noms p1 et p2 comme tant deux structures de trois membres. p3. avec les m^mes noms et les e e m^mes types. e e par exemple : struct char nom 20 . e e si plus loin on crit : e struct char nom 20 . e Troisi. En e et. L'inconv nient de cette m thode e e est qu'il sera par la suite impossible de d clarer une autre variable du m^me type..p2. elles seront consid r es de types di rents. p1. int no_employe. les deux structures ont beau avoir le m^me nombre de champs. char prenom 20 . int no_employe. Il sera impossible en particulier e ee e d' crire p3 = p1.me m thode e e On peut d clarer des variables de type structure sans utiliser d' tiquette de structure.

int no_employe.p2. p1. e e e comme ceci : struct personne char nom 20 . d clare les deux variables p1 et p2 et donne le nom personne . char prenom 20 .me m thode e e On peut combiner d claration d' tiquette de structure et d claration de variables.

L. la structure.

on e a a pourra utiliser ult rieurement le nom struct personne pour d clarer d'autres variables : e e struct personne pers1. pers3. pers2. aussi. e De ces trois m thodes c'est la premi. qui seront du m^me type que p1 et p2.

re qui est recommand e. car elle permet de bien e e e s parer la d nition du type structure de ses utilisations. e e 104 .

Initialisation d'une structure struct personne p = Une structure peut ^tre initialis e par une liste d'expressions constantes .

la mani.

re e e a e des initialisations de tableau. Exemple : "Jean". 6.1 Acc. "Dupond".3. 7845 .3 Op rateurs sur les structures e 6.

s aux membres des structures e Pour d signer un membre d'une structure.nom et on d signera le membre e e no_employe de p2 par p2. il faut utiliser l'op rateur de s lection de e e e membre qui se note .no_employe. Les membres ainsi d sign s se comportent comme e e n'importe quelle variable et par exemple. on d signera le membre nom de p1 par p1. pour acc der au premier caract. Par exemple. si p1 et p2 sont deux variables de type struct personne. point.

on crira : p2. e 6.. On peut a ecter une structure .nom 0 . p1 = p2.3.re du nom de e e p2.p2 .2 A ectation de structures struct personne p1..

gr^ce . une variable structure de m^me type.

e e 6.3. l'op a e a a e rateur d'a ectation : 6. m^me pas les op rateurs == et !=.4 Tableaux de structures Une d claration de tableau de structures se fait selon le m^me mod.3 Comparaison de structures Aucune comparaison n'est possible sur les structures.

le que la d claration e e e e d'un tableau dont les l ments sont de type simple. Supposons que l'on ait d j.

d clar la ee ea e e struct personne.nom.5 Exercice Soit un chier de donn es identiques a celui de l'exercice pr c dent. Pour r f rencer le nom de la personne qui a l'index i dans t on crira : t ee e i . on crira : e e struct personne t 100 . si on veut d clarer un tableau de 100 structures de ce type. e . 6.

article. 2. 105 . lise le chier en m morisant son contenu dans un tableau de structures. parcoure ensuite ce tableau en imprimant le contenu de chaque structure. ee Ecrire une proc dure main qui : e 1. nombre et e prix. chaque e structure permettant de m moriser le contenu d'une ligne nom.

char article 80 .h ***************************************************************************** * main * ***************************************************************************** int main FILE * fi. struct commande char nom 80 .prix. .include stdio. int i. * tableau des commandes * index dans tab_com * * dernier index valide dans tab_com apr. define nb_com 100 struct commande tab_com nb_com . * int ilast. int nombre.

s remplissage e * if fi = fopen"exer7.data". whilei * * i++. i++ printf"s s d d n". tab_com i ."s s d d". &tab_com i . else * boucle de lecture des commandes * ------------------------------i = 0. fclosefi. &tab_com i .1."r" == NULL printf"Impossible d'ouvrir le fichier exer7.nom.data n". i = ilast. tab_com i .prix != EOF * corps du while * if i = nb_com printf"le tableau tab_com est sous-dimentionn n". tab_com i . 106 . e else * impression des commandes m moris es e e * ----------------------------------ilast = i . tab_com i . tab_com i .article.nombre.prix.nombre.article. nb_com && fscanffi.nom. tab_com i . * * for i = 0.

..6 Pointeurs vers une structure Supposons que l'on ait d ni la struct e struct personne . personne a . .6.

l'aide de la d claration : e on d clarera une variable de type pointeur vers une telle structure de la mani.

on pourra alors a ecter a p des adresses de struct .re suivante : e e struct personne *p.

Cela se fait de la faon suivante : e c struct personne . int main struct personne pers.7 Structures dont un des membres pointe vers une structure du m^me type e Une des utilisations fr quentes des structures. p = &pers. . struct personne . personne. * les diff rents membres e struct personne *suivant. il faut que chaque structure contienne un membre qui soit de type e pointeur vers une structure du m^me type.. . Exemple : pers est une variable de type struct personne p est un pointeur vers une struct personne * * 6.. est de cr er des listes de structures e e cha^n es. * * personne. struct personne *p... * le membre de nom suivant est d clar comme tant du type pointeur vers une struct e e e La derni. Pour cela.

1 6.8 Acc.re structure de la liste devra avoir un membre suivant dont la valeur e sera le pointeur NULL que nous avons vu en 5.

Supposons que nous ayons d clar p comme tant de type pointeur vers une struct e e e comment crire une r f rence .s aux l ments d'une structure point e e ee e personne.

un membre de la structure point e par p ? e ee a e 107 .

nom pour r f rencer le e e e e ee membre nom. Mais il faut savoir que les op rateurs d'indirection * et de s lection . on serait tent d' crire *p. Ce qui fait que *p. Et il se trouve que l'indirection a e e e une priorit inf rieure a celle de la s lection. ont une priorit . Etant donn que *p d signe la structure.. tout e e comme les op rateurs arithm tiques.nom sera interpr t comme e e .

Dans notre cas. Cela aurait un sens si p tait une structure dont un des membres e s'appelait nom et tait un pointeur. il faut crire *p.nom pour forcer e e l'indirection a se faire avant la s lection. e ee signi ant *p.nom. .

le langage C a pr vu un nouvel op rateur not .qui e e e e e r alise a la fois l'indirection et la s lection : p . e Cette criture tant assez lourde.nom est identique .

nom. Exemple : e . *p.

on peut crire : e e p no_employe = 13456. 6. pour a ecter e ee une valeur au membre no_employe de la structure point e par p.9 Passage de structures en param. e a si p est de type pointeur vers la struct personne d nie pr c demment.

mois. struct date d2 if d1..annee returnAVANT. APRES ..annee.annee d2.annee d2. if cmp_dated1. . il n'est pas possible de passer en param.d2...tre e Supposons que l'on ait fait la d claration suivante : e struct date int jour. . une fonction de comparaison de deux dates pourra s' crire : e enum AVANT. int cmp_date struct date d1. EGAL.annee returnAPRES. Attention En langage C k&r.d2 == AVANT . * comparaison portant sur mois et jour * et une utilisation de cette fonction pourra ^tre : e struct date d1. if d1.

mais e on peut passer un pointeur vers une structure. 108 .tre une structure.

6.10 D termination de la taille allou e .

un type e e a Pour conna^tre la taille en octets de l'espace m moire n cessaire pour une variable. e e on dispose de l'op rateur sizeof. Cet op rateur est un op rateur unaire pr x que l'on e e e e e peut employer de deux mani.

taille = sizeof i. taille = sizeof struct personne.10.taille. taille = sizeof short int. 6.res di rentes : soit sizeof expression soit sizeof  nome e de-type .1 Retour sur la conversion des tableaux L'op rande de l'op rateur sizeof est la seule exception . Exemple : int i.

la conversion d'un identi cae e a teur de type tableau de x en pointeur vers x. Ne pas r aliser cette conversion est en e et e n cessaire pour que l'op rateur sizeof ait l'e et attendu par le programmeur lorsqu'il e e l'applique a un tableau. Exemple : .

int t 10 .11 Allocation et lib ration d'espace pour les structures e Nous allons voir dans ce paragraphe trois fonctions de la biblioth. 6. if sizeoft sizeofint != 10 printf"sizeof mal impl ment n". e e else printf"sizeof ok n".

que standard pere mettant d'allouer et de lib rer de l'espace.1 Allocation d'espace : fonctions malloc et calloc Quand on cr e une liste cha^n e. e 6.11. c'est parce qu'on ne sait pas .

la compilation combien e e a elle comportera d' l ments .

Allocation d'un l ment : fonction malloc ee La fonction malloc admet un param. Pour pouvoir ee a e cr er des listes. il est donc n cessaire de pouvoir allouer de l'espace dynamiquement. On e e dispose pour cela de deux fonctions malloc et calloc. l'ex cution sinon on utiliserait un tableau.

109 . p = mallocsizeofstruct personne.tre qui est la taille en octets de l' l ment d sir e ee e e et elle rend un pointeur vers l'espace allou . Utilisation typique : e include stdlib.h struct personne *p.

Allocation d'un tableau d' l ments : fonction calloc ee Elle admet deux param.

On lib. Utilisation typique : include stdlib... . * init de nb_elem * p = callocnb_elem.tres : e le premier est le nombre d' l ments d sir s .sizeofstruct personne. int nb_elem.h struct personne *p.p 1 .. ee e e le second est la taille en octets d'un l ment. . On peut alors utiliser les l ments p ee 0 . ee son but est d'allouer un espace su sant pour contenir les l ments demand s et de rendre ee e un pointeur vers cet espace.. p nb_elem-1 .

re l'espace allou par malloc ou calloc au moyen de la proc dure free qui e e e admet un seul param.

tre : un pointeur pr c demment rendu par un appel .

. * utilisation de la structure allou e e freep.h struct personne *p... 6.11. p = mallocsizeofstruct personne.2 Lib ration d'espace : proc dure free e e * 6. Utilisation typique : include stdlib. en crivant une proc dure d'impression d'une struct commande pass e en parae e e m. malloc ou e ee a calloc.12 Exercice Modi er le programme pr c dent : ee 1.

en crivant une fonction de recherche de commande maximum celle pour laquelle e le produit nombre  prix est maximum.tre. Cette fonction admettra en param. e 2.

tre un e pointeur vers la struct commande qui est t^te de la liste compl.

et rendra un e e pointeur vers la structure recherch e.te. le main sera modi de mani. e 3.

re .

faire appel a la fonction de recherche de la come e a .

mande maximum et .

imprimer cette commande. a 110 .

. com.h stdio. char article 80 . int nombre.prix.article. ***************************************************************************** * * * print_com * * * * But: * * Imprime une structure commande * * * ***************************************************************************** void print_comstruct commande com printf"s s d d n".nom.include include stdlib.nombre. 111 .prix.h * * * les types communs a toutes les procedures * ----------------------------------------struct commande char nom 80 . com. com. com. struct commande *suiv.

suiv prix. * * pointeur vers le max courant * pointeur vers l'element courant * suiv. vcour = pcour . pcour = pcour . else pmax = l_com.nombre * pcour if vcour vmax vmax = vcour. int vmax. pmax = pcour. returnpmax. struct commande *pcour.***************************************************************************** * * * max_com * * * * But: * * Recherche la commande pour laquelle le produit nombre * prix est * * le maximun * * * * Interface: * * l_com : la liste dans laquelle doit se faire la recherche * * valeur rendue : pointeur vers la structure commande recherch e e * * ou NULL si l_com est vide * * * ***************************************************************************** struct commande *max_comstruct commande * l_com struct commande *pmax. 112 . vmax = pmax for pcour = l_com nombre * pmax prix.vcour. if l_com == NULL returnNULL. pcour != NULL.

prix. suiv = cour. print_com*max_coml_com. cour = cour print_com*cour.*cour. suiv * recherche et impression de la commande maximum * ---------------------------------------------printf"La commande maximum est : n". * * fclosefi. else for cour = l_com."r" == NULL printf"Impossible d'ouvrir le fichier exer7. * fermeture du fichier * 113 . * * * liste des commandes pour la commande pr c dente et courante e e valeur de retour de fscanf * * * if fi = fopen"exer7.data". &cour . val_ret = fscanffi. else prec prec = cour. else * * do lecture du fichier avec cr ation de la liste de commandes e --------------------------------------------------------* * cour = mallocsizeofstruct commande. &cour . while val_ret != EOF. int val_ret. if val_ret == EOF freecour.nombre. struct commande *l_com = NULL.article.nom. ifl_com != NULL prec else if l_com == NULL l_com = cour. suiv = NULL.***************************************************************************** * main * ***************************************************************************** int main FILE * fi."s s d d". struct commande *prec. cour != NULL.data n". cour . * parcours de la liste avec impression * * -----------------------------------* if l_com == NULL printf"La liste de commandes est vide n". cour .

13. Un exemple typique est la programmation e syst.6.1 G n ralit s ee e Il est parfois n cessaire pour un programmeur de d crire en termes de bits la struce e ture d'une ressource mat rielle de la machine.13 Les champs de bits 6.

le registre d' tat est ainsi d crit : e e bit 0 : carry . e bits 8-10 : masque des interruptions . Par exemple. bit 1 : over ow .me qui n cessite de manipuler des registres particuliers de la machine. bits 5-7 : inutilis s . e e dans le manuel du mc 68030 de Motorola. e bit 4 : extension . e bit 3 : n gatif . e bits 12-13 : niveau de privil. bit 11 : inutilis . bit 2 : z ro .

. e bits 14-15 : tat des traces. e Il existe dans le langage C un moyen de r aliser de telles descriptions.ge .

extend : 1. * * inutilis e inutilis e * * On voit que le langage C accepte que l'on ne donne pas de nom aux champs de bits qui ne sont pas utilis s. Dans ce cas. En e et. priv : 2. : 1. l'aide du e a concept de structure. dans une d claration de structure. carry : 1. int int int int int int int int int int trace : 2. : 3. le langage C appelle ca un champ de bits. il est possible de faire e suivre la d nition d'un membre par une indication du nombre de bits que doit avoir ce e membre. overflow : 1. negative : 1. zero : 1. e 114 .  Le registre d' tat du mc 68030 peut se d crire ainsi : e e struct sr unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned . masque : 3.

2.2 Contraintes 1. unsigned int et signed e int. Les seuls types accept s pour les champs de bits sont int.13.6. L'ordre dans lequel sont mis les champs de bits .

mais g n ralement. Un champ de bit d clar comme tant de type int. dans une machine little endian les premiers e ee champs d crivent les bits de poids faibles et les derniers champs les bits de poids e forts. peut en fait se comporter comme e e e un signed int ou comme un unsigned int cela d pend de l'impl mentation. alors que c'est g n ralement l'inverse dans une machine big endian. Il e e est donc recommand d'une mani. ee 3. l'int rieur d'un mot d pend de a e e l'impl mentation.

e 4.re g n rale de d clarer les champs de bits comme e e ee e tant de type unsigned int. on ne peut donc pas lui appliquer l'op rateur e adresse de &. Un champ de bits n'a pas d'adresse. 6.2 que l'on pouvait d clarer des constantes nomm es e e de la mani.10.14 Les num rations e e Nous avons vu au paragraphe 1.

JEUDI. VENDREDI. DIMANCHE . SAMEDI. comme tant des constantes enti.re suivante : e enum LUNDI. MARDI. qui d clare les identi cateurs LUNDI. MARDI. etc. MERCREDI.

etc.res de e e e valeur 0. 1. Ce qui n'avait pas t dit .

ce moment l.

. c'est que les num rations ee a a e e fonctionnent syntaxiquement comme les structures : apr.

j2 = MARDI.s le mot-cl enum il peut y avoir e e un identi cateur appel tiquette d' num ration qui permettra plus loin dans le programme ee e e de d clarer des variables de type num ration. DIMANCHE . MARDI. VENDREDI. j1 = LUNDI. SAMEDI. JEUDI. MERCREDI. L'exemple ci-dessus est conforme . j2. enum jour j1. Exemple : e e e enum jour LUNDI.

ce qui nous semble ^tre de bonnes r.

gles de proa e e grammation : d clarer d'abord le type num ration en lui donnant un nom gr^ce .

e e e e e e e Exemples : enum jour LUNDI. JEUDI. le langage C permet de d clarer des variables dans la e d claration du type num ration. VRAI b1. 115 . Cepene e e e dant. MARDI.b2. VENDREDI. d1. comme pour les structures. dont les vae e e e leurs peuvent ^tre FAUX ou VRAI. d clare d1 et d2 comme tant des variable de type enum e e enum FAUX. Nous avons expliqu plus haut pourquoi un tel style de e e programmation nous semblait mauvais. SAMEDI. une e e e a a tiquette d' num ration et ensuite utiliser ce nom pour d clarer des variables. d clare b1 et b2 comme tant des variables de type num ration sans nom. MERCREDI. ventuellement en omettant l' tiquette d' num ration. d2. DIMANCHE jour.

6. tant que la pr cision des e e e entiers de la machine sera su sante et qui passera automatiquement a une repr sentation .15 Les unions Il est parfois n cessaire de manipuler des variables auxquelles on d sire a ecter des e e valeurs de type di rents. Supposons que l'on d sire crire un package math matique qui e e e e manipulera des nombres qui seront impl ment s par des int.

e sous forme de ottants d.

Il sera n cessaire de disposer de e e variables pouvant prendre soit des valeurs enti.s que ce ne sera plus le cas.

e Ceci peut se r aliser en C. La di rence s mantique entre les ee e e struct et les unions est la suivante : alors que pour une variable de type structure tous les membres peuvent avoir en m^me temps une valeur. float f. L'identi cateur nombre est appel tiquette d'union. une variable de type union ne peut e avoir . soit des valeurs ottantes.res. gr^ce au m canisme des unions. le mot cl struct tant simplement e e e e remplac par le mot cl union. Exemple : e e union nombre int i. Une d nition d'union e a e e a la m^me syntaxe qu'une d nition de structure.

En reprenant l'exemple a e pr c dent. cette variable pourra poss der soit une valeur enti. on d clarera une variable n de type union nombre par : ee e union nombre n. un instant donn qu'un seul membre ayant une valeur.

mais pas e e les deux a la fois. . soit une valeur ottante.re.

16 Acc. 6.

s aux membres de l'union e Cet acc.

 que celui qui sert a acc der e e e e e .s se fait avec le m^me op rateur s lection not .

e aux membres des structures. si on d sire faire poss der . Dans l'exemple pr c dent.

la ee e e a variable n une valeur enti.

14159. si on d sire lui faire poss der une valeur ottante. on crira : e e n.re. on crira : e e e n.f = 3. 6. le programmeur n'a malheureusement aucun moyen de savoir .i = 10.17 Utilisation pratique des unions Lorsqu'il manipule des variables de type union.

quel est le membre de l'union qui poss. un instant donn .

Pour ^tre utilisable.de a e e une valeur. une union doit donc toujours ^tre associ e .

En pratique. une union 116 . une variable e e e a dont le but sera d'indiquer le membre de l'union qui est valide.

et son indicateur sont g n ralement englob s .

Dans l'exemple ee e a e pr c dent. on proc dera de la mani. l'int rieur d'une structure.

FLOTTANT . . On d clarera des variables par : e struct arith a1. et u de type union d'int et de puis on pourra les utiliser de la mani. union int i.re suivante : ee e e enum type ENTIER. * indique ce qui est dans u * la struct arith a deux membres typ_val float. float f.a2. u. struct arith enum type typ_val. de type int.

typ_val = ENTIER.u.typ_val = FLOTTANT.f = 3.i = 10.re suivante : e a1.14159. a2.u. Si on passe en param. a1. a2.

tre .

une proc dure un pointeur vers une struct arith. la proc dure e a e e testera la valeur du membre typ_val pour savoir si l'union reue poss.

de un entier ou un c e ottant. 6.18 Une m thode pour all ger l'acc.

ce qui . il faut donner un nom au membre de la structure qui est de type union.s aux membres e e e Quand une union est dans une structure.

pour cons quence de rendre assez lourd l'acc.

On peut e e e e crire par exemple : e define I u. a1. On peut all ger l' criture en utilisant les facilit s du pr processeur.i define F u.u. on crira alors : e a1. Dans l'exemple pr c dent.s a e e aux membres de l'union.typ_val = ENTIER. 117 .f Pour initialiser a1 avec l'entier 10.I = 10.f pour acc der au ee e e membre f. il faut crire a1.

118 .

Chapitre 7 Les expressions Ce chapitre d bute par l' tude des conversions. probl.

me qui avait t .

dans un contexte o. Il se poursuit par la pr sentation des op rateurs e e e e non encore vus et se termine par l' tude de la s mantique des expressions.1 Les conversions de types Dans un programme. peine e eur e e e eea e quand nous avions parl des op rateurs. e e 7.

la valeur fournie en partie droite doit galement ^tre de e e type ottant. il u faut normalement fournir une valeur de ce type. si la partie gauche d'une a ectation est de type ottant. l'on attend une valeur d'un certain type. Par exemple. Il est cependant agr able de ne pas ^tre trop strict sur cette r.

on attend un ottant et on e fournit une structure. Si le type e e e attendu et le type de la valeur fournie sont trop di rents. il est normal que le compilateur consid.gle.

On   e e e peut admettre par exemple. c'est une facilit agr able que le compilateur fasse lui-m^me la conversion. Si par contre. que dans un contexte o. le type attendu et le type de la valeur fournie sont assez  proches  .re qu'il s'agit d'une erreur e du programmeur.

on u puisse fournir un nombre entier. on attend un nombre ottant. Autre situation o.

Les machines physiques u sur lesquelles s'ex cutent les programmes comportent des instructions di rentes pour r ae e e liser de l'arithm tique sur les entiers et sur les ottants. les conversions sont utiles : les expressions. Cette situation se retrouve dans e les langages de programmation de bas niveau les assembleurs o.

le programmeur doit u utiliser des op rateurs di rents pour r aliser la m^me op ration au sens math matique e e e e e e du terme selon qu'elle porte sur des entiers ou des ottants. Les langages de programmation de haut niveau par contre. surchargent les symboles des op rateurs arithm tiques e e de mani.

re a ce que le m^me symbole puisse r aliser une op ration indi remment entre e .

Ceci est d j. e e e e entiers ou entre ottants : le symbole + permet de r aliser l'addition de deux entiers ou e deux ottants.

une facilit agr able. mais il est possible d'aller plus loin. Le ea e e langage peut autoriser le programmeur .

e . charge au compilateur de faire une conversion de type sur l'un ou l'autre des e op randes pour les amener a un type commun. donner aux op rateurs des op randes de types a e e di rents.

il se peut que le langage o re au programmeur la possibilit de demander exe plicitement une conversion de type : si le langage pascal n'o re pas une telle possibilit . En n.1 Utilit des conversions e .1. e 119 7. e le langage C par contre dispose d'un op rateur de conversion de type.

La repr sentation d'une valeur est la cha^ne de bits qui compose e e cette valeur dans la m moire de la machine.7. La repr sentation des entiers est une suite de e e bits en notation binaire simple pour les positifs. g n ralement en compl ment .2 Ce qu'il y a dans une conversion Pour comprendre ce qui se passe dans une conversion il faut bien distinguer type. valeur et repr sentation.1.

La repr sentation des ottants est plus compliqu e. sans changer cette valeur si c'est possible . elle pourra ventuellement s'accompagner d'un changement de repr sene e tation. Exemple de conversion sans changement de repr sentation : la e conversion d'entier non sign vers entier sign ou vice versa. Une conversion a pour but de changer le type d'une valeur. c'est g n ralement un triplet e e e ee de cha^nes de bits : signe. sur une machine o. mantisse. 2 pour les ee e a n gatifs. Exemple de conversion avec changement de repr sentation : la conversion d'entier vers e ottant ou vice versa. exposant.

les entiers e e u sign s sont repr sent s en compl ment .

Si ce n'est pas possible : Conversions vers un type entier depuis un type entier La r. e e e e a 7. 2.3 L'ensemble des conversions possibles matique de l'objet.1.

la valeur math e e e si le type destination est un type sign . si c'est possible. on consid.gle est de pr server.

e e e si le type destination est un type non sign .re qu'il y a d passement de e e e capacit et la valeur du r sultat n'est pas d nie. la valeur du r sultat doit ^tre e e e gale modulo n .

o. la valeur originale.

n est le nombre de bits utilis s pour e a u e repr senter les valeur du type destination. e Dans ce qui suit. on se place pr cis ment dans la cas o.

la machine repr sente les e e u e nombres sign s en compl ment .

Une conversion d'un entier vers un entier plus court e se fait par troncature des bits les plus signi catifs. Une conversion d'un entier vers un entier plus long se fait par extension du bit de signe si le type originel est sign . e e a Une conversion d'un entier sign vers un entier non sign . e e depuis un type ottant La r. e par extension de z ros si le type originel est non sign . se fait sans e e changement de repr sentation. 2 c'est le cas de pratiquement toutes les machines. ou vice versa.

gle est de pr server. si c'est possible. la valeur e e math matique de l'objet. sachant qu'il peut y avoir une erreur d'arrondi. e est consid r comme un type entier non sign de la m^me taille que les pointeurs. Il ee e e est ensuite converti dans le type destination selon les r.

Pour cela il e Conversions vers un type ottant Seuls les types entiers et ottants peuvent ^tre convertis en un type ottant.gles de conversions d'entiers e vers entiers. depuis un pointeur Un pointeur peut ^tre converti en un type entier. L.

aussi. e a la r.

e e 120 .gle est de pr server la valeur si possible. sinon c'est un cas d'over ow ou d'under ow.

La valeur enti.Conversion vers un type pointeur Les di rentes possibilit s sont les suivantes : e e Un type pointeur vers 1 peut ^tre converti en un type pointeur vers 2 quels que e soient 1 et 2.

Une valeur enti.re 0 peut ^tre convertie en un type pointeur vers quel que soit . e e et c'est la valeur dite de pointeur invalide.

Nous avons vu pr c demment au paragraphe 4. mais cela est explicitement non portable.1 : ee Toute expression de type tableau de x est convertie en type pointeur vers x.re non nulle peut ^tre convertie en un type pointeur vers quel que e e soit . Il y a une r.

4 Les situations de conversions Dans le langage C.1. Cela n'a de sens que si e la valeur r sultat n'est pas utilis e.gle similaire concernant les fonctions : e Toute expression de type fonction retournant x est convertie en type pointeur vers fonction retournant x. T T T T T T T T Conversion vers le type void N'importe quelle valeur peut ^tre convertie vers le type void. les situations o. e e 7.

e passage de param. se produisent les conversions sont les suivantes : u 1. une valeur d'un certain type est utilis e dans un contexte qui en demande un autre.

tre : le param.

tre e ectif n'a pas le type du param.

tre formel . e e e a ectation : la valeur .

e 2. un op rateur a des op randes de types di rents. c'est le compilateur qui choisit le type d'arriv e de la conversion. a ecter n'a pas le m^me type que la variable . Dans e e e le cas 3. op rateur de conversion : le programmeur demande explicitement une conversion. a e valeur rendue par une fonction : l'op rande de return n'a pas le type indiqu e e dans la d claration de la fonction. Il le e fait selon des r. e e e Dans les cas 1 et 2. type de d part et type d'arriv e de la conversion sont donn s. par contre. e 3.

gles soigneusement d nies. Il y en a deux dans le langage C qui portent e e les noms de  promotion des entiers  et  conversions arithm tiques habituelles . e Ce que l'on appelle dans le langage C promotion des entiers est une r.

La promotion des entiers a pour but d'amener les e  petits entiers  .gle de conversion e des op randes dans les expressions.

  a 121 7.5 La promotion des entiers . la taille des int.1.

Domaine d'application La promotion des entiers est appliqu e .

et ~. l'op rande des op rateurs unaires +. e e e e La r. . e a e e ainsi qu'aux deux op randes des op rateurs de d calage et . La promotion des entiers e e e est galement utilis e dans la d nition des conversions arithm tiques habituelles .

gle e Une valeur de type char. peut ^tre utilis e dans un contexte o. un short int ou un champ de bits. ou d'une version sign e ou e non sign e des pr c dents.

Cette valeur est convertie en un int ou un unsigned int d'une mani. un int ou un unsigned e ee e e u int est demand .

sinon. la valeur est convertie e e en int .re e e h las d pendante de l'impl mentation : e e e si un int peut repr senter toutes les valeurs du type de d part.6 Les conversions arithm tiques habituelles e Domaine d'application Les conversions arithm tiques habituelles sont r alis s sur les op randes de tous les e e e e op rateurs arithm tiques binaires sauf les op rateurs de d calage et ainsi que sur e e e e les second et troisi.1. 7. elle est convertie en unsigned int.

e e e La r.me op randes de l'op rateur ?:.

Sinon la promotion des entiers est r alis e sur les deux op randes. si un op rande est de type long int. e c. l'autre op rande est converti en double. l'autre op rande est converti en float. l'autre op rande est converti en e e long int. e sinon. si un op rande est de type unsigned int. si un op rande est de type long int et l'autre de type unsigned int. Ensuite : e e e a. Sinon si un op rande est de type float. Sinon. e e 3. les deux op randes sont de m^me type. Si un op rande est de type unsigned long int. l'autre op rande est converti e e en unsigned int. l'autre op rande est converti e e en unsigned long int. et il n'y a pas de conversion .gle e 1. e e 4. l'autre op rande est converti en long e e double. Si un op rande est de type long double. 2. e alors : si un long int peut repr senter toutes les valeurs d'un unsigned int. Sinon. Sinon si un op rande est de type double. les deux op randes sont convertis en unsigned long int. e l'op rande de type unsigned int est converti en long int. d. e. Sinon. b. Sinon.

e 122 . e e a r aliser.

3 sont faciles a comprendre : si les deux op randes sont ottants.Discussion Les points 1. celui . 2.

sign s ou non sign s. Si un seul des op randes est de e e type ottant. On applique alors la promotion des entiers. l'autre est converti dans ce type. normaux e ee ou longs. de mani. e de moindre pr cision est converti dans le type de l'autre. On aborde le point 4 si les deux op randes sont des vari t s d'entiers courts.

re .

e e e a .

Si l'on excepte les cas o. il n'y plus comme types possibles que e int. A la suite de cela. unsigned int. se d barrasser des entiers courts. long int et unsigned long int.

le reste des r. les deux types sont identiques.

gles peut se u e r sumer dans le tableau suivant : e unsigned long int long int long int unsigned int op rande e op rande e quelconque unsigned int int int unsigned long int long int unsigned long int long int unsigned int r sultat e D'une mani.

les conversions sont un m canisme qui fonctionne .re g n rale.

la satise ee e a faction du programmeur. Il y a cependant une situation o.

7. cela peut donner des r sultats u e surprenants : quand on r alise une comparaison entre entiers sign s et entiers non sign s. bizarre . else printf "Tout semble normal n". bizarre . le programme suivant : int main unsigned int i = 0. if i -1  printf"Bizarre. n". e e e Par exemple..7 Les surprises des conversions imprimera le message Bizarre. 0 est inf rieur .... pouvant laisser croire que pour le langage C.1..

e a L'explication est la suivante : l'op rateur a un op rande de type unsigned int la e e variable i. D'apr. et un autre op rande de type int la constante -1. .1.

on voit que dans un tel cas. les op randes sont convertis e e en unsigned int. Le compilateur g n.s le tableau des e e conversions donn ci-dessus.

d'o.re donc une comparaison non sign e entre 0 et ee e 4294967295 puisque -1 = 0x = 4294967295.

il su t d'utiliser l'op rateur de conversion pour e pr venir le compilateur de ce qu'on veut faire : e int main unsigned int i = 0. 123 . u e Pour que tout rentre dans l'ordre. le r sultat.

* L..if int i -1  * comparaison entre deux int printf"Bizarre. bizarre . n".. else printf "Tout semble normal n".

o.

tout se complique c'est qu'on peut utiliser des entiers non sign s sans le savoir ! a u e Consid rons le programme suivant : e int main if sizeofint -1 printf"Bizarre.... d'o. et e cependant les entiers n'ont pas une longueur n gative ! L'explication est la suivante : l'op e e rateur sizeof rend une valeur dont le type est non sign . le compilateur a g n r une comparaison non sign e entre 4 sizeofint e ee e et 4 294 967 295. le lecteur a sans doute devin qu'il va imprimer le message Bizarre.. else printf "Tout semble normal n". bizarre . n". bizarre .. Voici ce que dit exactement la e norme :  La valeur du r sultat de sizeof d pend de l'impl mentation. Dans e notre exemple. et son type un e e e e type entier non sign  est size t qui est d nit dans le chier d'include stddef.h .

u e Recommandations 1. le r sultat. Ne jamais m langer des entiers sign s et non sign s dans des comparaisons : utilie e e ser l'op rateur de conversion pour amener l'op rateur de comparaison .

2 Les op rateurs e Nous avons tudi les op rateurs arithm tiques usuels dans le chapitre sur les bases e e e e du langage. les op rateurs incr ment et d cr ment dans le chapitre sur les tableaux. les e e e e op rateurs d'adresse dans le chapitre sur les pointeurs et les op rateurs de s lection dans e e e le chapitre sur les structures. e e 2. Bien noter que l'op rateur sizeof rend une valeur de type entier non sign . avoir des e e a op randes de m^me type. e e 7. Le langage C comporte quelques autres op rateurs que nous allons tudier ci-apr.

1 Op rateur non bit .s.2. e e e 7.

bit e a Syntaxe : expression :  ~ expression S mantique : e expression est valu e et doit d livrer une valeur de type entier. l'op ration non bit e e e e a .

e e e 124 . et le r sultat obtenu est la valeur de l'expression ~. bit est r alis e sur cette valeur.

7.2 Op rateur et bit .2.

bit e a Syntaxe : expression :  expression 1 & expression 2 S mantique : e Les deux expressions sont valu es et doivent d livrer des valeurs de type entier. le e e e et bit .

3 Op rateur ou bit . et la valeur obtenue est la valeur de l'expression &.2. bit est r alis . a e e 7.

bit e a Syntaxe : expression :  expression 1 | expression 2 S mantique : e Les deux expressions sont valu es et doivent d livrer des valeurs de type entier. le e e e ou bit .

2. a e e 7. et la valeur obtenue est la valeur de l'expression |.4 Op rateur ou exclusif bit . bit est r alis .

. et la valeur obtenue est la valeur de l'expression ^. le e e e ou exclusif bit a bit est r alis . bit e a Syntaxe : expression :  expression 1 ^ expression 2 S mantique : e Les deux expressions sont valu es et doivent d livrer des valeurs de type entier.

e e 7.2.5 Op rateur d calage .

gauche e e a Syntaxe : expression :  expression 1 expression 2 S mantique : e Les deux expressions sont valu es et doivent d livrer des valeurs de type entier. la e e e valeur de expression 1 est d cal e a gauche de expression2 bits en remplissant les bits e e .

libres avec des z ros.2. e e 7. Le r sultat obtenu est la valeur de l'expression .6 Op rateur d calage .

droite e e a Syntaxe : expression :  expression 1 expression 2 125 .

S mantique : e Les deux expressions sont valu es et doivent d livrer des valeurs de type entier. la e e e valeur de expression 1 est d cal e .

7 Op rateur conditionnel e Syntaxe : expression :  expression 1 ? expression 2 : expression 3 S mantique : e expression 1 est valu e et doit d livrer une valeur de type entier. pour qu'une telle construction e e ait un sens. expression 3 est valu e et le r sultat est la valeur de l'expression condie e e tionnelle.8 Op rateur virgule e Syntaxe : expression :  expression 1 .2. le d calage peut ^tre logique ou arithm tique les bits lib r s e e e e ee sont remplis avec le bit de signe. expression 2 S mantique : e expression 1 est valu e et sa valeur ignor e. expression 2 est valu e et le r sultat est la valeur de l'expression e e e conditionnelle. Remarque 126 . 7. cela d pend de l'impl mentation. On peut crire par exemple : e i = j = 2 . droite de expression2 bits. Exemples Cet op rateur permet de remplacer une instruction if : e max = a b ? a : b. mais la lisibilit en sou re : e e printf"i est s". Si expression 1 d livre e e a e une valeur unsigned. le d calage est un d calage logique : les bits lib r s sont remplis e e ee avec des z ros. On peut utiliser cet op rateur en cascade. il faut que expression 1 fasse un e et de bord. Si cette valeur est : e e e non nulle. expression 2 est valu e et sa valeur est e e e e e la valeur de l'expression virgule. Etant donn que la valeur de expression 1 est ignor e.i 0 ? "negatif n" : i 0 ? "positif n" : "nul n". nulle. e e 7.2. 1. Sinon.

ce qui est une mani.

re particuli.

j = j + 2 j = j + 2 ceci permet de rendre manifeste que i = 1 et j sont la partie it ration de la boucle. = LIMITE.9 Op rateurs d'a ectation compos e e e Chacun des op rateurs + . j = 1. Si on d sire crire une boucle for qui utilise deux index..rement horrible d' crire : e e e i = 1. e = 1 sont la partie initialisation et i++ et 7. i++. il est utile d' crire e e e par exemple : for i = 1. Une utilisation agr able par contre de l'op rateur virgule est dans les expressions d'une e e boucle for. i ..*  e & ^ | peut s'associer .2. j = 2.

e 127 . e e Syntaxe : expression :  lvalue += expression expression S mantique : e lvalue = lvalue + 7. l'op rateur d'a eca e tation pour former respectivement les op rateurs += -= *= = = = = &= ^= |=. l'op rateur de conversion de type s'appelle un cast. Le mot anglais cast signi e pl^tre pour maintenir un membre bris . celles des autres s'en d duit imm diatement.3 Op rateur conversion e Syntaxe : expression :   type  expression S mantique : expression est valu e et convertie dans le type indiqu par type. il donne donc bien une id e de a e e contrainte. une conversion de type s'appelle en ee anglais une coertion. e e e e Note Dans le jargon C. mais c'est quand m^me un choix bizarre. que l'on peut traduire par contrainte ou coercition. Dans le vocae bulaire des langages de programmation en g n ral. e Nous donnerons la syntaxe et la s mantique de ces op rateurs dans le cas de l'op rateur e e e +=.

. e Dans k&r C. il tait utilis essentiellement pour deux raisons : e e 1.Exemples d'utilisation L'op rateur de conversion est devenu moins utile avec la normalisation du langage C.

En e et. les proc dures d'allocaa ee e tion de m moire comme malloc taient d nies par : e e e extern char * malloc. cause de l'absence de pointeur g n rique void *. ce qui n cessitait d'utiliser l'op rateur de conversion de type a chaque utilisation : e e .

2. . p1 = struct s1 * mallocsizeofstruct s1. p2 = struct s2 * mallocsizeofstruct s2.

cause de l'absence de prototype de fonction qui rendait impossible la d claration a e du type des param.

Si une proc dure p attendait un e e param.tres des fonctions externes.

tre de type float. et si on d sirait lui passer la valeur poss d e par la variable e e ee i de type int. e Il reste cependant un certain nombre de situations o. il ne fallait pas crire pi mais pfloat i.

En voici un exemple. Il faut regarder l'ordre des octets dans un entier. d'o. l'op rateur de conversion est u e n cessaire. Il s'agit d'un programme qui a pour but de d terminer si e e l'architecture de la machine est de type little endian ou big endian.

e e int i = 0x01020304. char *p. Ex cut sur une machine Sun . la n cessit de l'op rateur de conversion. Ce programme u e e e suppose que les int sont impl ment s sur 4 octets. * int * transform en char * e * if *p++ == 1 && *p++ == 2 && *p++ == 3 && *p++ == 4  printf"big endian n". else p = char * &i. else printf"architecture exotique !! n". p = char * &i. if *p++ == 4 && *p++ == 3 && *p++ == 2 && *p++ == 1  printf"little endian n".

processeur sparc. e e a e ex cut sur un pc . ce programme r pondra big endian.

e e a e 128 . processeur Intel. il r pondra little endian.

4. les constructions suivantes :  * .1 Op rateurs d'adressage e Dans le langage C. & pour l'appel de proc dure e pour l'indexation pour l'indirection pour la s lection de champ e pour l'indirection et s lection e pour d livrer l'adresse d'un objet e sont des op rateurs .7.4 S mantique des expressions e 7.

part enti.

la s mantique de l'exprese e e sion *p++ ne peut se d terminer que si l'on conna^t les priorit s relatives des op rateurs * e e e et ++. ont une priorit et sont en concurrence avec les autres op rateurs e e e pour d terminer la s mantique d'une expression. a a Un op rateur a une associativit . Par exemple.4. Cela signi e que ces op rateurs. En e et. 7.re. seule la connaissance de e e e e l'associativit de l'op rateur == permet de savoir si a == b == c signi e a == b == c e e ou si elle signi e a == b == c. que l'on peut appeler e a e e op rateurs d'adressage.2 Priorit et associativit des op rateurs e e e Pour d terminer la s mantique d'une expression il faut non seulement conna^tre la e e priorit des op rateurs mais galement leur associativit .

droite quand : e ea op b op c signi e a op  b op c. Un op rateur a une associativit .

Nous donnons ci-dessous le tableau exhaustif des op rateurs avec leurs priorit s et leurs e e associativit . gauche quand : e ea op b op c signi e a op b op c. e 129 .

++ a -. post x e post x e c pr x e e d pr x e e e unaire f unaire g indirection h adresse de i multiplication j et bit bit a b .e + f *g &h sizeof = *= = = = = &= ^= |= Associativit e G D D G G G G G G G G G G D D G Discussion Les choix faits pour les priorit s des op rateurs sont assez mauvais.d .priorit Op rateur e e 16  15 ! ~ ++ c 14 conversion 13 *i  12 + 11 10 = == != 9 8 &j 7 ^ | 6 5 && || 4 3 ?: 2 = += -= 1 . les concepteurs du e e langage eux-m^mes en conviennent. 1 Les choix les plus irritants sont les suivants : e La pr c dence des op rateurs bits .b -.

bits est plus petite que celle des op rateurs de ee e a e comparaison. La pr c dence des op rateurs de d calage est plus petite que celle des op rateurs de ee e e e + et -. Recommandation Il est consid r comme un bon style de programmation en C. de syst matiquement ee e parenth ser les expressions d. mais a & b==c. Donc a&b == c ne signi e pas a&b == c. Donc a 4 + b signi e a 4 + b.

like any other language. e 1. Some of the operators have the wrong precedence. The C programming langage. page 3 : C. 130 .s qu'elles comportent d'autres op rateurs que les op rateurs e e e e de l'arithm tique usuelle. has its blemishes.

7.4.3 Ordre d' valuation des op randes e e .

Par exemple. l'instruction : t i = f. o. A part quelques exceptions. Ceci a pour cons quence que le programmeur doit faire extr^mement e e e e attention aux e ets de bords dans les expressions. l'ordre d' valuation des op randes d'un op rateur n'est pas e e e sp ci par le langage.

la fonction f modi e la valeur de i a un comportement ind termin : il est impossible u e e de savoir si la valeur prise pour indexer t sera celle de i avant ou apr.

s l'appel a f. e .

Ce programme a la propri t extraordinaire ee d'^tre un source valide a la fois pour le shell bin sh. le langage C et fortran ! Voici le e . 7.5 R cr ation e e Voici en illustration de l'op rateur ~. la contribution de Jack Applin a la comp tition e e du code C le plus obscur ioccc de 1986.

"Hello. world!" . * * . echo "Hello.' end * La version shell La commande cat =13 est une commande incorrecte . main write cat-~-cat *. and bin sh. f77. source : cat =13 * dev null 2 &1. cat. exit * * This program works under cc. world!". * . putchar~-~-~-cat.' * .

Le reste du source lui est donc indi rent. Ensuite. toute ligne commenant par * a . l'echo imprime  Hello world . puis le shell fait exit. Ensuite. cause du blanc entre cat et le a signe =. les deux versions C et fortran sont m lang es e e e gr^ce a un emploi judicieux des commentaires en fortran. mais comme l'erreur standard est redirig e sur dev null. le message d'erreur e n'appara^t pas.

le source devient : e e write *. world!"' end ce qui imprime  Hello world .'"Hello. La version fortran Une fois d barrass des commentaires fortran. c ou c est un commentaire. 131 .

La version C Apr.

"Hello. main write cat-~-cat . putchar~-~-~-cat. La d claration cat =13 .s nettoyage des commentaires C. le source original devient : e cat =13 . cat. world!" . est valide en C k&r mais obsol.

te en ansi C : elle est quivae e e lente .

e 2. avoir les entiers n gatifs repr sent s en compl ment . Cette forme est cependant encore g n ralement accept e avec un a ee e warning par les compilateurs. int cat =13 . ^tre une machine unix pour disposer de l'appel noyau write . La suite ne fonctionne correctement que sur une machine satisfaisant aux deux contraintes suivantes : 1.

2.1. ~-x e e e e a vaut x . Donc cat-~-cat vaut 1 qui. en premier param. Dans ce cas en e et.

et e e ~-~-~-13 vaut 10 le code de newline.tre de write d signe la sortie standard. Le troisi.

me param.

tre pass .

write doit ^tre la e e ea e longueur de la cha^ne .

ici 13 qui est bien la longueur de Hello. ce programme imprime  Hello world . Au a nal. imprimer. 132 . world!.

L'inclusion de chier source a d j. le traitement e de macros et la compilation conditionnelle.Chapitre 8 Le pr processeur e Les services rendus par le pr processeur sont : l'inclusion de chier source.

t vue dans eae e le chapitre 1. 8.14 nous n'y reviendrons pas.1 Traitement de macros Il existe deux types de macros : les macros sans param.

tre et les macros avec parae m.

1 Les macros sans param. e 8.tres.1.

tres e Les macros sans param.

tre ont t introduites au paragraphe 1. toute nouvelle occurrence de nom par reste-dela-ligne. Rappelons que e ee lorsque le pr processeur lit une ligne du type : e define nom reste-de-la-ligne il remplace dans toute la suite du source.10.1. Il n'y a aucune contrainte quand .

ce qui peut se trouver dans reste-de-la-ligne. a mais l'utilit principale des macros sans param.

tre est de donner un nom parlant .

Les avantages . une e e a constante.

2. la constante chi r e se trouve . toujours donner un nom aux constantes sont les suivants : a 1. un nom bien choisi permet d'expliciter la s mantique de la constante. Exemple : e define NB_COLONNES 100.

par exemple. on peut expliciter les relations entre constantes. ce qui facilite la modi cation du e a programme quand on veut changer la valeur de la constante cas de la taille d'un tableau. un seul endroit. Exemple : define NB_LIGNES 24 define NB_COLONNES 80 define TAILLE_TAB NB_LIGNES * NB_COLONNES 133 . 3.

Exemple de mauvaise utilisation Du fait de l'absence de contrainte sur reste-de-la-ligne. on peut faire des choses tr.

s e d raisonnables avec les macros. Un exemple c l.

bre est le source du shell crit par Steve e ee e Bourne pour le syst.

me unix. FI Ce n'est ni du C ni de l'Algol. IF n.namid. .. define BEGIN define END define SWITCH define IN define ENDSW define FOR define WHILE define DO define OD define REP define PER undef DONE define DONE define LOOP define POOL switch  for while  . il y a un consensus dans la communaut C pour estimer e que ce genre de choses est a proscrire.namflg&N_RDONLY THEN failedn. Bourne avait utilis les facilit s de macros pour programmer e e e dans un dialecte de Algol 68. v.v NAMPTR STRING n. for. Et voici un exemple de code : assignn. do while . ELSE replace&n.wtfailed. Voici un extrait de ses d nitions : e define define define define define IF THEN ELSE ELIF FI if  else else if  .v.namval.

D nition de macro .

l'invocation du compilateur e a Certains compilateurs permettent de d nir des macros sans param.

tres .

La d nition se fera . Il est alors possible d' crire un programme utilisant une macro qui n'est e nulle part d nie dans le source. l'invocation e e a du compilateur.

l'invocation du compilateur. Ceci e e a 134 .

est tr.

par une phase de con guration par exemple. e .s pratique pour que certaines constantes critiques d'un programme aient une valeur e qui soit attribu e a l'ext rieur du programme.

e Ci-dessous. un exemple pour le syst.

c en e d nissant la macro sans param.me unix : la compilation du chier fic.

c 8.3 Les macros avec param.2 Macros pr d nies ee Il y a un certain nombre de macros pr d nies par le pr processeur : ee e nom __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ valeur de la macro forme syntaxique num ro de la ligne courante du programme source e entier nom du chier source en cours de compilation cha^ne la date de la compilation cha^ne l'heure de la compilation cha^ne 1 si le compilateur est iso.1. 0 sinon entier 8.tre de nom NB LIGNES et de valeur 24 : e e cc -c -DNB_LIGNES=24 fic.1.

tres e define Une macro avec param.

tres se d nit de la mani.

re suivante : e e e nom  liste-de-param.

tres-formels  reste-de-la-ligne e La liste-de-param.

tres-formels est une liste d'identi cateurs s par s par des virgules. Toute occurrence ult rieure de nom sera e e un appel de la macro et devra avoir la forme : nom  liste-de-param. Le e e e reste-de-la-ligne est appel  corps de la macro .

tres-e ectifs  e Dans la liste-de-param.

tres-e ectifs. les param.

tres sont s par s par des virgules et chaque e e e e param.

tre est une suite quelconque d'unit s lexicales. Le pr processeur remplace l'ene e e semble nom de la macro et liste de param.

tres e ectifs parenth s s. par reste-de-la-ligne e ee dans lequel chaque param.

tre formel est remplac par le param.

e e e Cette op ration de remplacement de texte porte le nom d'expansion de la macro.tre e ectif correspondant. e L'utilit principale des macros avec param.

i = maxj. b f int i.k.j.tres est de b n cier de la clart d'exprese e ee e sion des fonctions sans en sou rir la lourdeur : le code est ins r en ligne. Exemple : e define mina. * * e quivalent .k.k. donc on conomise ee e le code d'entr e et de retour de fonction. i = minj. b define maxa.

: i = a e quivalent .

j . * * a a b ? a : b b ? b : a 135 . : i = a j j k k ? ? j k : : k .

Attention La distinction entre macro avec et sans param.

tre se fait sur le caract.

re qui suit e e imm diatement le nom de la macro : si ce caract.

re est une parenth.

se ouvrante c'est une e e e macro avec param.

tres. sinon c'est une macro sans param.

si apr. En particulier.tre.

s le e e e nom de la macro il y a un blanc avant la parenth.

se ouvrante. a sera une macro sans e c param.

tre. Exemple : e define CARRE a a * a Une utilisation de CARRE2 aura comme expansion a a * a2 ! Attention donc .

a l'erreur di cile .

voir : la pr sence d'un blanc entre le nom d'une macro avec param.

tres a e e et la parenth.

le champs ags est un ensemble de bits d nis ci-apr. unsigned flags. some possibly updated asynchronously * . unsigned long offset. Dans cette structure. Il s'agit d'un fragment de gestion de la e m moire virtuelle. * atomic flags. atomic_t count. struct page *next_hash..se ouvrante. * d'autres champs * . e Exemple Cet exemple est tir du source de linux.. une structure page a t d nie : e ee e struct page struct inode *inode.

s : e e * Page define define define define define define flag bit values * PG_locked PG_error PG_referenced PG_uptodate PG_free_after PG_decr_after 0 1 2 3 4 5 Puis le programmeur a d ni des macros pour tester commod ment ces bits a l'aide de la e e .

. &page.flags test_bitPG_free_after. * test_bitPG_locked.flags test_bitPG_referenced. e fonction test bit d nie par ailleurs: * Make define define define define define define it prettier to test the PageLockedpage PageErrorpage PageReferencedpage PageUptodatepage PageFreeAfterpage PageDecrAfterpage above.flags test_bitPG_error. &page.. &page.flags 136 .flags test_bitPG_decr_after. &page. &page.flags test_bitPG_uptodate. &page.

Exemple de mauvaise utilisation Dans une invocation de macro. chaque param.

mais apr.tre e ectif peut ^tre une suite quelconque e e d'unit s lexicales.

t 10 .s expansion.i  = 1. * e quivalent . Voici un exemple des horreurs que l'on peut crire en utilisant les macros : e define macroa. le texte obtenu doit ^tre un fragment valide de e e e langage C. macrot.b a f int i.

* b Le second param. t i a = 1.

tre pass a la macro i  ne correspond syntaxiquement .

rien. mais le e e.

a r sultat de l'expansion de la macro est correct.1.4 Les pi. e 8.

ges des macros e Par le fait que le traitement des macros consiste .

a l' criture de macros rec. faire de la substitution de texte.

le de nombreux pi.

ges. e e e Pi.

ges des priorit s d'op rateurs e e e Supposons que l'on crive : e define CARREa a * a une occurrence de CARREa+b aura comme expansion a+b * a+b ce qui est di rent du e a+b * a+b qui tait d sir . De la m^me mani.

re !CARREx aura comme expansion e e e e e !x * x ce qui est di rent du !x * x qui tait d sir . e e e e On recommande donc de toujours respecter deux r.

gles dans la d nition d'une macro e e devant ^tre utilis e dans des expressions : e e 1. parenth ser les occurrences des param.

e e 2. e Une d nition de CARRE respectant ces r.tres formels . parenth ser le corps complet de la macro.

gles est : e e define CARREa a * a Pi.

ges des e ets de bord e L'utilisation d'e et de bord sur les param.

tres e ectifs d'une macro peut avoir des e e ets compl.

Apr.tement inattendus.

l'op rateur ++ sera e . e 137 * x++.s la d nition : e e e define CARREa a * a l'utilisation de CARREx++ aura comme expansion x++ donc appliqu deux fois.

Les macros peuvent aussi g n rer des instructions et l.Tous les exemples donn s jusqu'ici sont des exemples de macros g n rant des exprese ee sions.

aussi il y a des pi.

ges .

ee a e a viter. Supposons qu'ayant .

8. . on d nisse la macro suivante : e define Fx if !fx printf"erreur n".5 Macros g n rant des instructions ee La macro pourra s'appeler comme une fonction avec un . crire un grand nombre de fois un appel de fonction avec e ae test d'erreur. exit1.1.

. ... la n dans un contexte de a liste d'instructions: . dans un contexte d'instruction et non de liste d'instructions.. Fi. il ne faudra pas mettre de . . Par contre.

. Mais le pire reste . alors qu'il le faudrait si il s'agissait d'une fonction : do fa. la n : a do Fa while  ... . . while  ..

 Fi else ... pour comprendre le probl.. printf"erreur n". venir : voyons ce qui se passe si on utilise la macro F dans un if avec a else : if  .... Il su t d'imaginer l'expansion de la macro : if  .  if !fx else . exit1...

.me : le else va ^tre raccroch au if de la macro. exit1. while 0 et tous les probl. ce qui n'est e e e pas ce qu'a voulu le programmeur. Notre exemple s' crit ainsi : e ee e define Fx do if !fx printf"erreur n". Recommandation Pour toute macro g n rant des instructions. on recommande d'englober les instructions ee g n r es dans la partie instruction d'un do . while 0..

e ee e 138 .mes pr c dents s' vanouissent.

2 Compilation conditionnelle Les m canismes de compilation conditionnelles ont pour but de compiler ou d'ignorer e des ensembles de lignes. le choix tant bas sur un test ex cut .8.

elle ne doit donc comporter que des constantes.1 Commande if if La commande permettant de r aliser la compilation conditionnelle est la commande e qui peut prendre plusieurs formes. endif Commande if avec else Sur rencontre de : if expression ensemble-de-lignes 1 else ensemble-de-lignes 2 endif le pr processeur value expression. L' valuation de expression a lieu au moment e e e de la compilation.2. ensemble-de-lignes est e e compil . Si expression d livre une valeur non nulle. e Commande if avec elif De mani. e e e ea 8. L'ensemble-de-lignes est une suite de lignes quelconques. la compilation. sinon ensemble-de-lignes 1 est ignor e e e et ensemble-de-lignes 2 est compil . ensemble-dee e e lignes 1 est compil et ensemble-de-lignes 2 est ignor . Commande if simple Quand le pr processeur rencontre : e if expression ensemble-de-lignes il value expression. sinon ensemble-de-lignes est ignor . Si expression d livre une valeur non nulle.

re .

il existe une commande elif e a e dont la s mantique est else if. imbriquer ais ment des if dans des if. Elle s'utilise de la mani.

elif expression n ensemble-de-lignes n else ensemble-de-lignes else endif Un seul ensemble-de-lignes sera compil : celui correspondant ..re suivante : e e if expression 1 ensemble-de-lignes 1 elif expression 2 ensemble-de-lignes 2 ..

la premi.

re expression i qui e a e 139 .

ou bien ensemble-de-lignes else si toutes les e .s' valuera a une valeur non nulle si elle existe.

expression i s' valuent .

e a 8.2 Commandes ifdef et ifndef Dans ce qui pr c.2. 0.

2. Cette commande a pour utilit de capturer .de il est possible de remplacer les commandes if expression par : ee ifdef nom ou ifndef nom. Il d livre la valeur 1 si nom est une e macro d nie. La commande ifdef nom a pour s mantique :  si nom e e est d ni . alors que ifdef ne peut en tester e qu'une. Dans ce cas. et ifndef nom a pour s mantique :  si nom n'est pas d ni . mais sur la e d nition ou non d'une macro.3 L'op rateur defined e L'op rateur defined est un op rateur sp cial : il ne peut ^tre utilis que dans le e e e e e contexte d'une commande if ou elif. e e e 8.4 La commande error La commande error a la syntaxe suivante : error suite-d-unit s-lexicales e La rencontre de cette commande provoquera l' mission d'un message d'erreur comprenant e la suite-d-unit s-lexicales. L'int r^t de cet op rateur est de permettre d' crire e ee e e des tests portant sur la d nition de plusieurs macros. if definedSOLARIS || definedSYSV 8.2. et la valeur 0 sinon. le test ne porte plus sur la nullit ou non d'une expression. Il peut ^tre utilis sous l'une des deux formes e e suivantes : defined nom ou bien : defined  nom .

Voici e un exemple o. la compilation des e e a conditions qui font que le programme ne peut pas s'ex cuter sur cette plate-forme.

on teste que la taille des entiers est su sante : u include limits.2.h if INT_MAX 1000000 error "Entiers trop petits sur cette machine" endif 8.5 Usage La compilation conditionnelle a pour but essentiel d'adapter le programme .

son envia ronnement d'ex cution : soit il s'agit d'un programme syst.

me devant s'adapter au mat riel e e e sur lequel il s'ex cute. soit il s'agit d'un programme d'application qui doit s'adapter au e syst.

me sur lequel il s'ex cute. Prenons par exemple le syst.

La routine de recherche d'un caract.me unix qui existe en deux e e e grandes variantes : la variante bsd et la variante system v.

Voici comment on peut crire un programme se compilant et e e s'ex cutant sur les deux plate-formes : le programmeur peut d cider d'utiliser un nom . e e e mais l'interface est le m^me.re d termin dans une cha^ne s'appelle index en bsd et strchr en system v.

et de le d nir comme ci-dessous. e e a lui. e if definedHAS_INDEX 140 . par exemple RechercheCar.

define RechercheCar index elif definedHAS_STRCHR define RechercheCar strchr else error "Impossible de r aliser RechercheCar" e endif Selon le syst.

me.c ou par : cc -c -DHAS_STRCHR fichier.3 R cr ation e e Quel est le plus petit programme possible en C? Mark Biggar a t un vainqueur de la comp tition du code C le plus obscur ioccc ee e avec un programme ne comportant qu'une seule lettre : P ! Pour arriver . la compilation se fera par : e cc -c -DHAS_INDEX fichier.c 8.

whileread0.1" -DT="c!=015" -DW="whileCI" -DX="char c.&c.1.c Le chier markb. il a e avait compliqu un petit peu la ligne de commande de compilation : e cc -DC="R 0" -DI="ifTO" -DO="c=write1.&c.&c.1 0 if c!=015 c=write1.W" markb. qui du fait de l'expansion des macros. ce r sultat. va ^tre e transform e en : e main char c. 141 .1." -DP="main X " -DR="read0.c contenant la lettre P.&c.

142 .

Chapitre 9 Les d clarations e Nous n'avons vu jusqu'.

pr sent que des exemples de d clarations. il est temps maina e e tenant de voir les d clarations de mani.

re plus formelle.1 D clarations de d nition et de r f rence e e ee Il existe dans le langage C. deux types de d clarations : e les d clarations qui d nissent compl. e e 9.

tement un objet. e les d clarations qui font r f rence . ce sont les d clarations de e e e e d nition .

un nom de structure ou d'union d ni dans la m^me unit de compilation. ee Les d clarations de d nition e e Ce sont celles que l'on utilise dans la grande majorit des cas : on d nit un objet et e e ensuite on l'utilise. ce sont les d clarations e ee a e e de r f rence. un objet d ni ailleurs. ... pour r soudre le cas e e e e d'appel r cursif : la fonction f1 appelle f2 qui appelle f3. pour e e e r soudre le cas de r f rence r cursive : la struct s1 poss. Les d clarations de r f rence e ee Elles sont n cessaires pour : e un nom de variable ou de fonction d ni dans une autre unit de compilation. qui appelle fn qui appelle e f1. e e un nom de fonction d ni dans la m^me unit de compilation.

de un champ dont le type e ee e e r f rence la struct s2 qui poss.

de un champ dont le type r f rence la struct s3 ee e ee qui etc. jusqu'.

a . revenir a la struct s1.

143 .

9.1. extern int j.1 D clarations de variables e Di rences entre d clarations et d nitions de variables : e e e une d claration de r f rence est pr c d e du mot-cl extern . * * * * d finition de i e r f rence . Exemples : int i. int t1 20 . e ee eee e une d claration de r f rence peut avoir un type incomplet : absence de la taille d'un e ee tableau. extern t2 .

un entier d fini ailleurs e e a e d finition de t e r f rence .

une d e e e claration de fonction n'ayant pas de partie instruction est une d claration de r f rence. mais e e on consid. un tableau t2 d fini ailleurs e e a e * * * * 9. e ee La pr sence ou l'absence du mot-cl extern dans l'un ou l'autre cas est possible.1.2 D clarations de fonctions e Une d claration de fonction ayant la partie instruction est une d nition.

re comme un bon style de programmation de le mettre .

une d claration de e a e r f rence et de l'omettre .

* min poss. int b . Exemples : ee a e * max n'a pas de partie instruction : d claration de r f rence e e e extern int maxint a. une d nition.

mais de d claration d' tiquette de structure ou union. * * 9. on proc. Quand on veut d clarer e e e une tiquette de structure ou union qui sera d nie plus tard. int b returna b ? a : b.de la partie instruction : c'est une d finition e e int minint a.3 D clarations d' tiquettes de structures et union e e Attention : il ne s'agit pas de d claration de noms de variables de type structure ou e union.1.

de de la mani.

. struct str1 .. struct str2 . . .re e e e e suivante : struct str1. * d finition de str1 qui r f rence str2 e e e * * * d claration de r f rence de str1 e e e d finition de str2 qui r f rence str1 e e e * * 144 .. struct str1 * p.. struct str2 *p.

2 Port e des d clarations e e Il existe en C quatre types de port es possibles pour les d clarations : e e un identi cateur d clar a l'ext rieur de toute fonction.Le m canisme est le m^me avec les unions. e e 9. a une port e qui s' tend de e e.

e e e son point de d claration jusqu'.

la n du source . e a un param.

tre formel de fonction a une port e qui s' tend de son point de d claration e e e e jusqu'.

la n de l'instruction compos e formant le corps de la fonction . a e un identi cateur d clar dans une instruction compos e a une port e qui s' tend du e e e e e point de d claration jusqu'.

la n de l'instruction compos e . void proc1int j * * d claration . e a e une tiquette d'instruction a une port e qui comprend tout le corps de la fonction e e dans laquelle elle appara^t. Exemple : int i.

l'ext rieur de toute fonction e a e j param.

* * * * instructions 1 * d claration .. . int l.tre de la proc dure proc1 e e * * .. * * * int func1 . k: if .......

e ee e l pourra ^tre r f renc par instructions 2 . e ee e 145 . e ee e k pourra ^tre r f renc par instructions 1 et instructions 2 . e ee e j pourra ^tre r f renc par instructions 1 et instructions 2 . l'int rieur d'une instruction compos e e a e e instructions 2 fin de proc1 d but de func1 e instructions 3 fin de func1 * * * * * * Dans cet exemple. i pourra ^tre r f renc par instructions 1 . instructions 2 et instructions 3 .

c'est a dire que les d clarations d'une instruction compos e englob e cachent .3 Visibilit des identi cateurs e Dans le langage C. l'imbrication des instructions compos es forme une structure clase sique de blocs.9.

e e e les d clarations d'une instruction compos e cachent les d clarations de m^me nom. De surcro^t. e e e les d clarations des instructions compos es englobantes ayant le m^me nom. qui e e e e sont .

if a b * * * cache le i pr c dent e e cache le j pr c dent e e cache le k pr c dent e e * * * * cache le i pr c dent e e * int i. int k.. l'ext rieur de toute fonction.4. Exemple : a e int i.. int j. int k. int j. void proc1 int i.4 Les espaces de noms 9. . 9.1 Position du probl.

me e Il existe certaines situations o.

double d. . parce que le contexte d'utilisation du nom permet de d terminer quel est e e l'objet r f renc . Consid rons l'exemple suivant : ee e e struct st1 int i. struct st2 int i. int j. l'on peut accepter que le m^me nom d signe plusieurs u e e objets di rents. . int main 146 .

i = s2. struct st2 s2.i = s2.struct st1 s1. la premi. il y a deux occurrence du nom i. * * d claration de la variable s1 e d claration de la variable s2 e * * Dans l'instruction s1.i. s1.i.

re d signe e e le i de s1. On dit alors que le i de s1 et le i e . et la seconde d signe le i de s2. On voit que le contexte d'utilisation de i a e permis de d terminer a chaque fois de quel i il s'agit.

de s2 appartiennent .

des espaces de noms di rents. e Nous donnons ci-dessous un exemple o.2 Les espaces de noms du langage C Il y a quatre types d'espaces de noms dans le langage : un espace pour les tiquettes de structures. un espace pour les tiquettes de branchement . e e e un espace pour les noms de champs de structures ou unions : il y a un espace de nom pour chaque structure et chaque union . d'unions et d' num ration . a e 9.4. e le dernier espace est form de tous les autres noms.

le m^me identi cateur i est utilis de mani.

goto i. int j. ii1.i2. ii1.i = 3.re u e e e valide dans 5 espaces de noms di rents.ii2. struct ii int i. int main i: * i est une tiquette de branchement * e i = 1.i = 2. i1. e int i. i1. struct i int i. * i est un champ de la struct ii * * * * i est un nom d'identificateur i est une tiquette de structure e i est un champ de la struct i * * * 147 . int j.

Remarque Certains auteurs consid.

rent galement qu'il existe un espace de noms pour les noms e e d nis .

l'aide de la commande define du macro-processeur. Nous avons refus cette e a e vision des choses dans la mesure o.

les variables automatiques et les variables dynamiques. pendant la phase de compilation proprement dite. Les variables statiques sont allou es au d but de l'ex cution du programme.5 Dur e de vie e Du point de vue de la dur e de vie. ces u noms n'ont plus d'existence. et ne e e e sont lib r es qu'. 9. il existe trois types de variables : les variables e statiques.

la n de l'ex cution du programme. ee a e Les variables automatiques sont allou es .

et e a e e lib r es lors de la sortie de l'instruction compos e. e ee a . ee e Les variables dynamiques sont allou es et lib r es explicitement par le programmeur. l'entr e d'une instruction compos e.

Il est classique en e et. qu'une variable e e globale c'est a dire dont la d claration se trouve . Dans les langages de programmation. il y a g n ralement un lien troit entre la port e ee e e de la d claration d'une variable et sa dur e de vie. l'aide des fonctions malloc et free.

l'ext rieur de toute fonction. soit une .

soit une variable . et qu'une variable locale a une proc dure ou fonction. e a e variable statique.

elle sera prise par e d faut de type automatique. e Cette libert de donner . Si la d claration d'une variable locale est pr c d e e eee du mot cl static. e automatique. cette variable sera statique. et en l'absence de l'un et l'autre de ces mots-cl s. Les variables globales sont e ici aussi des variables statiques. elle e eee e sera automatique. Dans le langage C. si elle est pr c d e du mot-cl auto. mais les variables locales peuvent ^tre au choix du proe grammeur statiques ou automatiques. le programmeur a davantage de libert .

une variable locale une dur e de vie gale .

celle du proe a e e a gramme. permet de r soudre des probl.

mes du type expos ci-dessous. Imaginons une e e e proc dure qui pour une raison quelconque doit conna^tre combien de fois elle a t appee ee l e. Le programmeur a besoin d'une variable dont la dur e de vie est sup rieure a celle de e e e .

il n'y a aucune raison qu'une autre proc dure e e e e puisse en modi er la valeur. la proc dure concern e. Cependant cette variable doit e e ^tre une variable priv e de la proc dure. il faut donc que ce soit une variable locale . ce sera donc une variable statique.

a e En C. la proc dure. on programmera de la mani.

re suivante : e Discussion 148 .

de mani. nb_appel++..void proc static int nb_appel = 0. Dans d'autres langages.. .

re .

on aurait e a e t oblig de faire de la variable nb_appel. ce qui est tout a fait illogique. une variable globale. la rendant ainsi accessible ee e aux autres proc dures. e . satisfaire les contraintes de dur e de vie.

G e e n ralement cependant. cette classe tant choisie de mani. toute fonction peut ^tre r cursive . core e e respondant aux trois dur es de vies possibles : e la zone contenant les variables statiques . Un tel d coupage se rencontre couramment dans les langages de programmation. la zone contenant les variables automatiques cette zone est g r e en pile puisqu'en ee C. 9. il n'est pas n cessaire au programmeur de d clarer la classe dans e e e laquelle il d sire mettre une variable.6 Classes de m moire e Lors de l'ex cution d'un programme C il y a trois zones de m moire di rentes. e e la zone contenant les variables dynamiques cette zone est g n ralement appel e le ee e tas.

En e et. Les concepteurs du langage C ont voulu o rir plus de souplesse aux programmeurs. nous venons de voir que l'on pouvait mettre dans la classe des variables statiques une variable qui tait locale .re autoritaire par e e e le langage.

6. les concepteurs du langage ont cr une nouvelle e e ee ee classe : la classe register. Quand le programmeur d clare par exemple : e register int i. pour des raisons e a e d'e cacit des programmes g n r s. D'autre part.1 Position du probl. une instruction compos e. 9.

me e ceci est une indication au compilateur. lui permettant d'allouer la variable dans une ressource de la machine dont l'acc.

s sera plus rapide que l'acc.

s .

une m moire si une telle e e a e ressource existe. 149 .

6.9.2 Les sp ci cateurs de classe de m moire e e Il existe 5 mots-cl s du langage que la grammaire nomme sp ci cateur de classe de e e m moire. Il s'agit des mots-cl s suivants : e e auto Ce sp ci cateur de classe m moire n'est autoris que pour les variables locales .

Il indique que la variable concern e . une e e e a instruction compos e.

une dur e de vie locale e e a e a .

Pour les d clarations de variables.. Si la d claration d'une variable locale ne comporte pas de e e sp ci cateurs de classe de m moire. variables et fonctions. int j. . Exemple : e e e auto int i. c'est auto qui est pris par d faut. static Ce sp ci cateur de classe m moire est autoris pour les d clarations de variables et e e e e de fonctions.. * * * * i ne sera pas export par l' diteur de liens e e j sera export par l' diteur de liens e e f ne sera pas export par l' diteur de liens e e k aura une dur e de vie globale e * * * * void g . * g sera export e par l' diteur de liens e e * register Ce sp ci cateur n'est autoris que pour les d clarations de variables locales .. l'instruction compos e.. static void f static int k. Dans tous les cas. il indique que la variable concern e e e a une dur e de vie globale.. Exemple : e e e e static int i. .. il indique que e le nom concern ne doit pas ^tre export par l' diteur de liens.

et pour les d clarations de param. e e e a une instruction compos e.

Sa e e e signi cation est celle de auto avec en plus une indication pour le compilateur d'allouer pour la variable une ressource .tres de fonctions.

acc.

Le programmeur est suppos a e e mettre une variable dans la classe register quand elle est fortement utilis e par e l'algorithme. Il y a cependant une contrainte : une telle variable n'a pas d'adresse. e extern Ce sp ci cateur est autoris pour les d clarations de variables et de fonctions. Il e e e sert a indiquer que l'objet concern a une dur e de vie globale et que son nom est e e connu de l' diteur de liens. e typedef Ce sp ci cateur n'a rien a voir avec les classes de m moire : il sert . impossible donc de lui appliquer l'op rateur &.s rapide.

d nir des e .

e a e types. e 150 . Son utilit sera vue plus loin.

il est pris par d faut. 2. Conclusion : il ne sert a rien. mais si on ne le met pas. ne peut servir que pour les variables locales. e .Discussion On peut faire les critiques suivantes : 1.

auto sert .

deux choses tr.

mais il sert aussi .s di rentes : il permet de rendre statique une variable a e e locale. et c'est une utilisation l gitime.

cacher a l' diteur de liens e a .

On rappelle que par d faut c'est . e les variables globales.

dire sans le mot-cl static. Il aurait mieux valu e faire l'inverse : que par d faut les variables globales soient cach es a l' diteur de liens. e a e les variables globales sont connues de l' diteur de liens. e e .

il ne sert a rien car le compilateur est mieux a . e et avoir un mot-cl par exemple export. pour les lui faire conna^tre. Avec les ee techniques modernes de compilation. e static register a t introduit dans le langage pour optimiser les programmes.

.

m^me que le programmeur d'allouer les registres de la machine de mani.

re e cace. qu'il y a une contrainte attach e . e e Ne pas oublier en outre.

e e extern et typedef n'ont rien . l'utilisation de variables e a register : l'impossibilit de leur appliquer l'op rateur &.

voir avec les classes de m moire : ils ne sont l.

9.7.1 G n ralit s ee e D. 3. 4.7 La compilation s par e e e 9. que a e a pour des raisons syntaxiques.

puis les binaires obtenus sont li s a l'aide d'un diteur de e e e e e . il devient n cessaire pour e e e des raisons pratiques d'en fractionner le source en plusieurs unit s de compilation.s que l'on programme une application un peu cons quente. Chaque e unit est compil e s par ment.

Pour permettre cela. e liens pour cr er le programme d sir . La m thode la plus r pandue pour r soudre ce probl. le langage doit disposer d'un e e e moyen d'exprimer que certaines variables ou proc dures sont partag es par plusieurs unit s e e e de compilation.

il existe une autre m thode dite e e e  du common  . les variables partag es sont d clar es comme appartenant . Pour le seul cas des variables.   M thode des r fs et des d fs e e e Dans cette m thode les d clarations sont dissym triques : certaines d clarations sont e e e e des d nitions. et d'autres d clarations sont des r f rences.me est la m thode e e e e e dite  des r fs et des d fs . Une seule unit de compilation e e ee e doit d nir un nom. et plusieurs unit s de compilation peuvent le r f rencer. e e ee M thode du common e Dans cette m thode.

un e e e e a segment sp cial. appel common. Toute variable du common est r f renable par n'importe e e ee c quelle unit de compilation. C'est la m thode utilis e par fortran. e e e 151 .

7. La distinction entre ces trois cas se fait de la mani. r f rencer et e e ee mettre dans le common. le langage permet de d nir.2 La m thode du langage C e C'est un joyeux m lange des deux ! En e et.9.

alors q ne peut ^tre nul : il ne peut pas y avoir que des r f rences. pour un identi cateur donn . e ee Ceci fait beaucoup de possibilit s dont deux seulement sont  raisonnables  : e une d nition avec que des r f rences : on adh. et q  vent. extern int i. e ee Voyons les choses sous l'angle de ce qui est autoris . e e si n vaut 0. On peut avoir : e une d nition avec p  vent. p  vent. 0 r f rences et q non 0 demandes de mise dans le common. Les e ee e e contraintes sont les suivantes : n doit valoir 0 ou 1 : au plus une unit de compilation doit d nir un nom . 0 r f rences. int i = 1. int i. p l'auront r f renc . et q auront demand une mise dans le common. La d claration e est une d nition e d nition e r f rence ee mise dans le common Les contraintes Au moment de l' dition de liens. 0 demandes de mise dans le e e ee e common .re suivante : e Si la d claration e Il s'agit d'une comporte un initialisateur avec ou sans mot-cl extern e d nition e comporte le mot-cl extern mais pas d'initialisateur e r f rence ee ne comporte ni initialisateur ni le mot-cl extern e mise dans le common Exemples : extern int i = 1. n unit s de compilation e e e l'auront d ni.

re strictement .

la m thode des r fs e ee e a e e et des d fs . e que des demandes de mise dans le common : on adh.

re strictement .

. . extern int i common int i .. int i .. Ces deux m thodes sont r sum es dans le tableau suivant : e e e m thode unit de compilation 1 unit de compilation 2 .. unit de compilation n e e e e r fs d fs e e int i = 0. la m thode du e a e common. 152 .. extern int i. int i . ..

En pratique Les bons auteurs recommandent de s'en tenir a la stricte m thode des r fs et d fs. mais .

Cette m thode . e e e la lecture de nombreux sources montre que c'est la m thode du common qui a la faveur des e programmeurs.

La m thode des r fs et des d fs par contre. la d claration d'un nom est strictement la m^me. Cette d claration pourra e e e donc ^tre mise dans un chier qui sera inclus par include dans toutes les unit s de e e compilation qui utilisent ce nom. en e et un avantage pratique : dans toutes les unit s de e a e compilations. ee Le cas des fonctions Le cas des fonctions est plus simple dans la mesure o. impose d'avoir au moins deux d clarations e e e e di rentes pour un m^me nom : une pour la d nition et une autre qui peut ^tre dans un e e e e chier d'inclusion pour la r f rence.

Les fonctions adh. il n'y a pas de mise dans le u common.

rent donc strictement .

la m thode des r fs et des d fs. avec e a e e e une distinction facile .

si une d claration de fonction a e comporte une partie instruction c'est une d nition. Il consiste . e ee 9.1. faire : comme on l'a vu en 9. sinon c'est une r f rence.2.8 D nition de types e Il existe en C un moyen de donner un nom a un type.

faire suivre le mot .

Exemple : typedef int tab 10 . est le nom du type dans le cas d'un typedef. a cl typedef d'une construction ayant exactement la m^me syntaxe qu'une d claration de e e e variable. d clare tab comme tant le type tableau de 10 entiers. L'identi cateur qui est le nom de la variable dans le cas d'une d claration de e variable. personne. d clare personne comme tant le type structure a deux champs : un tableau de 20 carace e . et : e e typedef struct char nom 20 . int no_ss.

t.

9 Utilit des typedef e La principale utilit des typedef est. de faciliter e l' criture des programmes. si l'on en fait une utilisation judicieuse. Ces noms de type sont ensuite utilisables dans les d clarations de variables. et d'en augmenter la lisibilit . personne *p1. * * t1 et t2 tableaux de 10 entiers p1 et p2 pointeurs vers des struct * * 9. e e 153 .t2.res et un int.*p2. e e exactement comme un type de base : tab t1.

en se restreignant a deux valeurs. Comme le type bool en n'existe pas dans le langage.9. il faudra e e utiliser des int.9. par exemple 0 et 1. Supposons que nous voulions manipuler des bool ens. Il est alors int ressant .1 Restriction d'un type de base Il est parfois n cessaire de manipuler des variables qui ne peuvent prendre comme e valeurs qu'un sous-ensemble des valeurs d'un type de base.

e de red nir .

le type int. On crira par exemple : e a e define VRAI 1 define FAUX 0 typedef int BOOLEAN. l'aide d'un typedef. On pourra par la suite d clarer des  bool ens  de la mani.

if b2 == FAUX ...re suivante : e e e BOOLEAN b1. mais bien entendu. et les utiliser : b1 = VRAI. ce sera .b2.

On voit que la lisibilit du programme aura t augment e. la charge du programmeur d'assurer que les variables b1 et a b2 ne prennent comme valeurs que VRAI ou FAUX. dans la mesure o. Le compilateur ne protestera pas si on crit : e b1 = 10.

Lorsqu'on donne un nom a un type structure par typedef..2 D nition de type structure e struct personne . le programe ee e u meur aura pu expliciter une restriction s mantique apport e au type int.9. l'utilisation est beaucoup .. e e 9.

si on d clare : e e les d clarations de variables se feront par : e struct personne p1.p2. alors que si on d clare : e typedef struct . plus ais e. 154 . PERSONNE.. En e et..

on voit que la seconde m thode permet d' viter d'avoir .les d clarations de variables se feront par : e PERSONNE p1.p2.

e e a ee De la m^me mani. r p ter struct.

. en ce qui concerne les pointeurs.. PERSONNE.3 D nition de types opaques e Dans le cadre de l' criture de programme en plusieurs unit s de compilation. .p2.re. il est e e souvent utile de d nir un type de mani. * p1 et p2 pointeurs vers des struct * que la version suivante qui donne un nom parlant au type pointeur vers struct : typedef struct . * * P_PERSONNE type pointeur vers struct * p1 et p2 pointeurs vers des struct * 9.*p2.. P_PERSONNE p1. il est plus di cile d' crire et de e e e comprendre : struct personne . typedef PERSONNE *P_PERSONNE.. struct personne *p1.9.

re opaque. c'est .

dire d'en laisser libre l'utilisation e e a sans que l'utilisateur n'ait .

conna^tre sa d nition. C'est exactement ce que r alise la a e e biblioth.

que standard pour le type FILE : le programmeur sait que fopen rend une e valeur de type FILE * et que cette valeur doit ^tre pass e en param.

Il y a beaucoup d'autres exemples de e ce type dans la biblioth.tre des fonctions e e e d'entr es-sorties fprintf. fputc. fputs etc.

c Quali catif const Une variable dont le type est quali e par const ne peut pas ^tre modi e.que standard. Ceci n'est utile e que pour les param. e 9. Le proe e e grammeur entend ainsi se prot ger contre une erreur de programmation.10 Quali catifs de type Il y a deux faons possibles de quali er un type : par const ou par volatile.

lorsqu'on d sire prot ger le param.tres d'une fonction.

tres e ectifs e e e e de la fonction en les mettant en  lecture seulement  pour la fonction. 155 .

const char * const p. e e le pointeur et l'objet point sont quali s. char * const p. e e le pointeur lui-m^me est quali . e e type const char c. e e Les quali catifs de type deviennent p nibles en conjonction avec les pointeurs car on e a les trois possibilit s: e l'objet point est quali . const char *p. le programmeur pr vient le compie lateur que cette variable peut ^tre modi e par un moyen ext rieur au programme. Ceci se e e e produit lorsqu'on interagit avec des parties mat rielles de la machine : coupleurs d'entr ese e sorties g n ralement.Quali catif volatile En quali ant par volatile le type d'une variable. s mantique e caract. Lorsqu'une variable est de type volatile le compilateur ne doit pas ee proc der aux optimisations qu'il r alise sur les variables normales.

re constant e pointeur vers caract.

re constant e pointeur constant vers caract.

re e pointeur constant vers caract.

re constant e 9.11 Fonction .

nombre variable de param.

tres a e Il est possible de d clarer une fonction comme ayant un nombre variable de param.

tres e e en  d clarant  les param.

3 points ...tres optionnels par l'unit lexicale .

e e e a Une fonction peut avoir a la fois des param. la suite.

tres obligatoires et des param.

.tres optionnels.

e e les param.

tres obligatoires apparaissant en premier et l'unit lexicale . apparaissant en e e derni...

re position dans la liste de d claration des param.

tres formels. e e e Dans le corps de la fonction on ne dispose pas de nom pour d signer les param.

e e L'acc.tres.

s .

ceux-ci ne peut se faire qu'en utilisant les macros suivantes d nies dans la e a e biblioth.

que standard : e va list permet de d clarer une variable opaque au programmeur. .

passer en param.

tre e a e aux autres macros. et a pour but de rep rer le param. Cette variable s'appelle traditionnellement ap pour argument pointer.

tre e ectif courant. La macro va start a deux e e param. e e va start doit ^tre appel e avant toute utilisation de va arg.

tres : la variable ap et le nom du dernier param.

tre obligatoire de la fonction. e e d livre le param.

tre e ectif courant : le premier appel a va arg d livre le premier e e .

e param.

puis chaque nouvel appel .tre.

va arg d livre le param.

tre suivant. La macro e a e e va arg admet deux param.

tres : la variable ap et le type du param.

tre courant. e e doit ^tre appel e apr.

s toutes les utilisations de va arg. La macro va end admet e e e un seul param.

tre : la variable ap. e va arg va end Rien n'est pr vu pour communiquer .

la fonction le nombre et le type des param.

tres e a e e ectivement pass s : c'est un probl.

me .

e e a 156 . la charge du programmeur.

9.11.1 Exemple 1 Ci-dessous l'exemple de la fonction addn qui r alise la somme de ses param.

h ***************************************************************************** * * * addn * * * * But: * * r alise l'addition d'un nombre variable de param.h include stdarg.tres ope e tionnels. include stdio.

returns. . i = nbopd.nbopd.. va_startap. * * * * d claration de ap e initialisation de ap va_arg donne le param. i++ s = s + va_argap.int. * nbopd = nombre d'op randes du add e * int i.tres e e * * * ***************************************************************************** int addnint nbopd.. for i = 1. s = 0. va_endap. va_listap.

* imprime 33 * Dans cet exemple.11. le probl.12.addn3.10.tre courant e on a fini * * * * ***************************************************************************** * main * ***************************************************************************** int main printf"resu = d n".

me du nombre de param.

tres e ectifs a t r gl par un parae e ee e e m.

En ce qui concerne le type des param.tre obligatoire de la fonction : nbopd.

tres e ectifs. e e ils sont tous suppos s ^tre entiers. d'o.

le va argap. e e u 9.11.int.2 Exemple 2 Dans la biblioth.

que standard. il y a deux fonctions utilis es couramment qui ade e mettent un nombre variable de param.

..tres : ce sont printf et scanf. Voici leur d claration e e dans stdio.h : extern int printfconst char *... extern int scanfconst char *... Ces fonctions doivent conna^tre le nombre et le type des param. . .

tres optionnels. Ce pro e bl.

me est r gl par les s quences d' chappement se trouvant dans le param.

tre obligatoire : e e e e e e le nombre de param.

tres optionnels est gal au nombre de s quences d' chappement . e e e e le type de chaque param.

d pour int. 157 .tre optionnel est cod dans sa s quence chappement : c e e e e pour char. etc.

12 Syntaxe des d clarations e La grammaire des d clarations est la suivante : e d claration : e  sp ci cateurs-de-d claration liste-de-d clarateurs-init option e e e . sp ci cateurs-de-d claration : e e  sp ci cateur-de-classe-m moire sp ci cateurs-de-d claration option e e e e  sp ci cateur-de-type sp ci cateurs-de-d claration option e e e  quali catif-de-type sp ci cateurs-de-d claration option e e liste-de-d clarateurs-init : e  d clarateur-init e  liste-de-d clarateurs-init e d clarateur-init : e  d clarateur e  d clarateur e d clarateur-init e .9. = initialisateur sp ci cateur-de-classe-m moire : e e      auto extern static register typedef sp ci cateur-de-type : e  void  char  short  int  long  float  double  signed  unsigned  sp ci cateur-de-struct-ou-union e  sp ci cateur-d- num ration e e e  nom-de-typedef liste-de-d clarations-de-struct e sp ci cateur-de-struct-ou-union : e  struct-ou-union identi cateur option  struct-ou-union identi cateur struct-ou-union :  struct 158 .

: expression-constante liste-d- num rateurs e e sp ci cateur-d- num ration : e e e  enum identi cateur option  enum identi cateur liste-d- num rateurs : e e  num rateur e e  liste-d- num rateurs e e num rateur : e e  identi cateur  identi cateur quali catif-de-type : . union liste-de-d clarations-de-struct : e  d claration-de-struct e  liste-de-d clarations-de-struct d claration-de-struct e e d claration-de-struct : e  liste-de-sp ci cateurs-et-quali catifs liste-de-d clarateurs-de-struct e e liste-de-sp ci cateurs-et-quali catifs : e  sp ci cateur-de-type liste-de-sp ci cateurs-et-quali catifs option e e  quali catif-de-type liste-de-sp ci cateurs-et-quali catifs option e liste-de-d clarateurs-de-struct : e  d clarateur-de-struct e  liste-de-d clarateurs-de-struct e d clarateur-de-struct : e  d clarateur e  d clarateur option e d clarateur-de-struct e . . num rateur e e = expression constante   const volatile d clarateur : e  pointeur option d clarateur-direct e d clarateur-direct : e  identi cateur   d clarateur  e  d clarateur-direct e  d clarateur-direct e  d clarateur-direct e   expression-constante option liste-de-types-de-param.

tres e liste-d-identi cateurs option   159 .

pointeur :   * * liste-de-quali catifs-de-types option liste-de-quali catifs-de-types option pointeur liste-de-quali catifs-de-types :  quali catif-de-type  liste-de-quali catifs-de-types quali catif-de-type liste-de-types-de-param.

tres : e  liste-de-param.

tres e  liste-de-param.

..tres e . . liste-de-param.

tres : e  d claration-de-param.

tre e e  liste-de-param.

tres . d claration-de-param.

tre e e e d claration-de-param.

. donc e e r duit .j = 2 est une liste-de-d clarateur-init compos e de e e e deux d clarateur-init : i et j = 2.j = 2.tre : e e  sp ci cateurs-de-d claration d clarateur e e e  sp ci cateurs-de-d claration d clarateur-abstrait option e e e liste-d'identi cateurs :  identi cateur  liste-d'identi cateurs identi cateur . i est un d clarateur-init sans la partie initialisateur. initialisateur Exemples Dans la d claration : e int i. est un sp ci cateur-de-type et i. initialisateur :  expression-d'a ectation  liste-d-initialisateurs  liste-d-initialisateurs liste-d'initialisateurs :  initialisateur  liste-d'initialisateurs .

j = 2 est un d clarateur-init e a e e e . un d clarateur lui-m^me r duit a un identi cateur.

e comportant un initialisateur = 2 et un d clarateur r duit .

160 . un identi cateur j. Dans e e a la d claration : e int int t 10 .

La s mantique est la suivante : e e la seule r. suivi de . suivi de e e e constante 10. t 10 suivi de l'expression 9.13 S mantique des d clarations e e La partie qui n cessite d'^tre explicit e est la partie de la grammaire concernant les e e e d clarateur.est un d clarateur form d'un d clarateur t.

gle de la grammaire qui d rive vers un terminal est la r.

. * 3. et celle-ci est sup rieure a la priorit e e e . * 2.. Cet idene e ti cateur est le nom de l'objet d clar par la d claration.   est un constructeur permettant permettant de construire des types  fonction retournant .. Exemple : e e e char c. Exemple : * d claration de p de type pointeur vers short int e short int *p. . . expression-constante option est un constructeur permettant de construire des types  tableau de .gle : e e e d clarateur-direct : e  identi cateur ce qui fait qu'a l'int rieur de tout d clarateur se trouve un identi cateur. * d claration de la variable c de type char e * il y a 3 constructeurs de type : 1.. Exemple : * d claration de t de type tableau de 32 int e int t 32 . Exemple : * d claration de sin de type fonction retournant un double e double sin. Les e e constructeurs   et ont la m^me priorit . * les constructeurs de type peuvent se composer et sont a ect s de priorit s. ... * est un constructeur permettant de construire des types  pointeur vers .

int *f. la r. e du constructeur *. * * * tableau de 10 pointeurs vers des char fonction retournant un pointeur vers un int tableau de 10 tableaux de 10 double * * * tout comme avec des expressions. double t 10 10 . char *t 10 .

gle : e d clarateur-direct : e   d clarateur  e permet de parenth ser des d clarateur de mani.

re a en changer la s mantique : e e e .

char *t 10 . * * tableau de 10 pointeurs vers un char pointeur vers un tableau de 10 char * * 161 . e char *t 10 .

9.14 Discussion sur les d clarations e La syntaxe et la s mantique des d clarations ne sont pas faciles a appr hender dans le e e .

l'identi cateur qui est le nom de l'objet d clar . au lieu d'^tre mis en vidence dans la e e e e d claration. Tout d'abord. Au lieu d'avoir comme en pascal. e langage C pour les raisons que nous allons d velopper. on a en C : char c. Exemple : e e e char **p 10 . Ensuite. l'ordre des l ments e ee d'une d claration est assez peu naturel. le langage C fait partie des langages qui permettent au programmeur. qu'il faut traduire par  de type char est c . est cach au beau milieu du d clarateur. une d claration e e c : char. qu'on peut traduire par  c est de type char . ce qui est une inversion peu naturelle. a . D'autre part.

de construire des types complexes.   struct union Alors que le programmeur serait en droit de s'attendre . partir de types de base et de constructeurs de type. pour les fonctions . pour les structures . il existe dans le langage les constructeurs suivants : * pour les pointeurs . pour les unions. Du point de vue du programmeur. pour les tableaux .

ce que tous ces constructeurs a soient trait s de mani.

re homog.

les trois premiers sont des d clarateur alors e e e e que les deux derniers sont des sp ci cateur-de-type. e Autre point ajoutant encore a la confusion.ne. en fait. le constructeur * est un constructeur pr x .

e e alors que les constructeurs et   sont post x . et le constructeur * a une priorit e e di rente de celle des deux autres. Ceci a la cons quence extr^mement d sagr able. qu'un e .

mais peut n cessiter e e un analyse du type de celle que l'on fait pour comprendre une expression math matique. f est une fonction retournant un pointeur vers un tableau de pointeurs vers une fonction retournant un char 162 . e Par exemple. qui pourrait dire du premier coup d' il quel est le type de f dans la d claration ci-dessous 1 : e char **f  1. e e e e type complexe crit en C ne peut pas se lire de la gauche vers la droite.

9.15 En pratique Lorsqu'il s'agit d' crire ou de comprendre un type compliqu . e tant donn que la grammaire est faite de telle sorte que les d clarations calquent tr. mais de partir d'une utilisation du type. il est recommand non e e e pas d'utiliser la grammaire des d clarateur.

Soit .s e e e e exactement les expressions. Voyons sur un exemple.

d clarer un pointeur p vers une fonction retournant a e un int. Consid rons l'utilisation de p : .

on va appeler la fonction d livr e par e e l'expression *p. De la m^me mani. il faut d'abord utiliser l'op rateur e a e indirection pour obtenir la fonction. soit *p. La d claration de p s' crira donc : e e int *p. partir de p. Finalement cette expression nous d livre e e un int. Ensuite. pour cela il faut crire *p 2.

re. il vaut mieux partir d'une e e e e utilisation. pour interpr ter un type compliqu . Soit .

L'op rateur appel de fonction tant plus priorie e taire que l'op rateur indirection. Imaginons une utilisation: *fi j . on applique d'abord l'appel de fonction . interpr ter : a e char *f .

on voit que f est une fonction retournant un pointeur vers un tableau de char. Ce programme a t crit initialement pour hpux. donc f est une fonction retoure nant un pointeur. Donc f est e a une fonction. f. On peut le trouver facilement sur Internet en utilisant xarchie. 9. Ensuite on applique l'op rateur indirection.16 Un outil : cdecl Il existe dans le domaine public un petit outil pour manipuler les d clarations du e langage C : cdecl. On indexe le r sultat. donc f est une fonction retournant un pointeur e vers un tableau. on le trouve donc g n ralement class dans eee ee e les archives concernant ce syst. Finalement.

3 mais il est facilement portable sur une autre platee forme. A l'utilisation il faudra mettre les param. Le programme cdecl peut traduire une d claration C en pseudo-anglais commande e explain et vice-versa commande declare. Exemple d'interaction : osiris1 cdecl Type `help' or `?' for help cdecl explain char * argv declare argv as array of pointer to char cdecl declare p as pointer to function returning int int *p cdecl  appel de cdecl     la question la r ponse e la question la r ponse e 2.me.

on peut le trouver sur hpftp.cict.tres e ectifs e 3.0 163 . En juillet 96.fr: hpux Misc cdecl-1.

164 .

Chapitre 10 La biblioth.

que standard e Ce chapitre est un aide-m moire . il donne la liste exhaustive de toutes les fonctions de e la biblioth.

.1 Diagnostic La fonction assert permet de mettre des assertions dans le source du programme. utiliser la commande man sur une machine unix. 10. Pour obtenir e e e plus d'information.que standard. sans donner la s mantique pr cise de ces fonctions.

si le param. A l'ex cution.

tre de assert s' value .

faux. 10.2 Manipulation de caract. le programme est stopp sur e e e a e terminaison anormale.

h Toutes les fonctions ci-dessous permettent de tester une propri t du caract.res e fonction ctype.

re pass ee e e en param.

e isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit le param.tre.

tre est e une lettre ou un chi re une lettre un caract.

re de commande e un chi re d cimal e un caract.

re imprimable ou le blanc e une lettre minuscule un caract.

re imprimable pas le blanc e un caract.

re imprimable pas isalnum e un caract.

conversion en majuscule.re d'espace blanc e une lettre majuscule un chi re hexad cimal e On dispose galement de deux fonctions de conversions entre majuscules et minuscules : e tolower : toupper : conversion en minuscule . 165 .

trouve et tels que =  2p e e ldexp multiplie un nombre par une puissance enti.4.4. 10.4 Math matiques e math.2 Fonctions exponentielles et logarithmiques x n p fonction s mantique e exp exponentielle frexp tant donn .h 10.1 Fonctions trigonom triques et hyperboliques e e fonction s mantique acos arc cosinus asin arc sinus arc tangente atan atan2 arc tangente cosinus cos cosh cosinus hyperbolique sin sinus hyperbolique sinus sinh tan tangente tanh tangente hyperbolique 10.10. Ces e e e e fonctions sont setlocale et localeconv.h Il y a deux fonctions permettant de g rer les conventions nationales concernant l' crie e ture du point d cimal dans les nombres.3 Environnement local locale. le signe repr sentant l'unit mon taire etc.

re de 2 e log logarithme logarithme d cimal e log10 modf calcule partie enti.

3 Fonctions diverses fonction s mantique e ceil entier le plus proche par les valeurs sup rieures e fabs valeur absolue floor entier le plus proche par les valeurs inf rieures e reste de division fmod pow puissance sqrt racine carr e e setjmp.4.15.2 ne permet de r aliser des brane chements qu'au sein d'une m^me proc dure. Pour r aliser des branchements a l'ext rieur e e e .re et d cimale d'un nombre e e x n 10.5 Branchements non locaux L'instruction goto qui ne avons vu au paragraphe 3.h 10.

e d'une proc dure. il faut utiliser setjmp et longjmp. e 166 .

e e stdarg.10.h 10.6 Manipulation des signaux signal raise signal.7 Nombre variable de param.h Deux fonctions permettent d'interagir avec le m canisme des signaux : e permet d'installer une fonction qui sera ex cut e sur r ception d'un signal . e e e d clenche un signal chez le processus ex cutant.

tres e Si on d sire programmer une fonction avec un nombre variable de param.

2 Acc.8.tres.8 Entr es sorties e stdio.h 10. va_arg et va_end. 10.8. on e e dispose de trois macros : va_start.1 Op rations sur les chiers e fonction description remove destruction de chier rename modi cation de nom de chier tmpfile cr ation d'un chier temporaire e tmpnam g n ration de nom appropri pour un chier temporaire ee e 10.

s aux chiers e fclose fflush fopen freopen fonction description fermeture de chier criture sur chier des bu ers en m moire e e ouverture de chier ouverture de chier 10.3 Entr es-sorties formatt es e e fonction fprintf fscanf printf scanf sprintf sscanf vfprintf vprintf vsprintf description criture formatt e sur ot de donn es e e e lecture formatt e sur ot de donn es e e criture formatt e sur sortie standard e e lecture formatt e sur entr e standard e e criture formatt e dans une cha^ne de caract.8.

res e e e lecture formatt e depuis une cha^ne de caract.

res e e variante de fprintf variante de printf variante de sprintf 167 .

10.8.4 Entr es-sorties caract.

res e e fonction description fgetc lecture d'un caract.

re e fgets lecture d'une cha^ne de caract.

res e fputc criture d'un caract.

re e e fputs criture d'une cha^ne de caract.

res e e getc fgetc impl ment par une macro e e getchar getc sur l'entr e standard e gets lecture d'une cha^ne de caract.

res sur l'entr e standard e e putc fputc impl ment par une macro e e putchar putc sur la sortie standard puts criture d'une cha^ne de caract.

res sur la sortie standard e e refoule un caract.

5 Entr es-sorties binaires e Pour lire et crire des donn es binaires.8. on dispose de deux fonctions : fread et fwrite. e e fonction description fgetpos donne la position courante dans un chier fseek permet de se positionner dans un chier fsetpos permet de se positionner dans un chier ftell donne la position courante dans un chier rewind permet de se positionner au d but d'un chier e description remet .re sera lu par la prochain lecture e ungetc 10.

faux les indicateurs d'erreur et de n de chier a test de l'indicateur de n de chier test de l'indicateur d'erreur imprime un message d'erreur correspondant .

8.9 Utilitaires divers 10.6 Position dans un chier 10.8.1 Conversion de nombres Les fonctions suivantes permettent de convertir des nombres entre la forme cha^ne de caract.7 Gestion des erreurs clearerr feof ferror perror fonction 10.h 10. errno a stdlib.9.

res et la forme binaire. e fonction description atof conversion de cha^ne vers double atoi conversion de cha^ne vers int conversion de cha^ne vers long int atol strtod conversion de cha^ne vers double conversion de cha^ne vers long int strtol strtoul conversion de cha^ne vers unsigned long int 168 .

10.4 Communication avec l'environnement fonction description abort terminaison anormale du programme atexit installe une fonction qui sera ex cut e sur terminaison normale du programme e e obtention d'une variable d'environnement getenv system ex cution d'un programme e 10.9. malloc Trois de ces fonctions ont t vues au paragraphe 6.3 gestion de la m moire e free.9.5 Recherche et tri Deux fonctions : bsearch et qsort.9.9.9.11.9.7 Gestion des caract. fonction description abs valeur absolue div obtention de quotient et reste labs idem abs sur des long int 10.6 Arithm tique sur les entiers e 10.10.2 G n ration de nombres pseudo-al atoires ee e On dispose de rand et srand. La liste exhaustive est calloc. 10. ee et realloc.

res multi-octets e Les caract.

res multi-octets permettent de prendre en compte les langues qui ne peuvent e se satisfaire de caract.

strncmp . strpbrk. 169 . initialiser: memset . strncat . strstr.10 Manipulation de cha^nes string. strspn. La liste exhaustive des fonctions est : mblen. concat ner : strcat. mbstowcs. strcmp. transformer : strxfrm . strncpy . strchr. memmove.res cod s sur 8 bits. wcstombs. strtok . strcpy. strcoll.h On dispose de fonctions pour : copier : memcpy. rechercher : memchr. e comparer : memcmp. wctomb. e e mbtowc. strrchr. strcspn. calculer une longueur : strlen . 10.

.obtenir un message d'erreur a partir du num ro de l'erreur : strerror.

gmtime.11 Manipulation de la date et de l'heure time. asctime. difftime. time. localtime. e 10. mktime. 170 . strftime.h Les fonctions de manipulation de la date et de l'heure sont : clock. ctime.

Annexe A Les jeux de caract.

res e Un jeu de caract.

re est un ensemble de signes typographiques et un codage : .

1 Les normes L'histoire des jeux de caract. chaque e a signe est associ un nombre entier qui est son code. e A.

Le code ebcdic n'est pas une norme. l'iso cr e une norme internationale .res pour les besoins de l'informatique d bute avec le e e codage ebcdic sur 8 bits utilis par ibm et le codage ascii sur 7 bits utilis par le e e reste du monde. En 1963. mais le code ascii est une norme de l'ansi.

internatioe a nalisation oblige. partir de la norme ascii et. elle r serve 10 caract.

res pour des variantes nationales. La France dans e e une norme nf en utilisera 5 pour y caser des lettres accentu es .

 .

u laissant de c^t e acee.

mais il faut dire . Cette norme e c e est donc inutilisable pour crire r ellement en franais. oe l'accent circon exe si cher aux acad miciens franais. le tr ma et les ligatures.

qu'en utilisant un code . la d charge de e e c a e l'iso.

cela tait impossible. a e En 1988. 7 bits. l'iso dite une nouvelle norme de jeu de caract.

res .

Mais la diversit est telle e e e qu'il n'est pas possible de mettre tous les signes typographiques dans un seul jeu de 256 caract. 8 bits cette fois pour e e a prendre en compte les particularit s des langues europ ennes.

Les langues ont donc t regroup es en familles. et la norme iso-8859 comprend e ee e plusieurs jeux de caract.res.

Malheureusement.res. Celui qui nous int resse est celui qui est pr vu pour les langues e e e d'europe occidentale et qui est r f renc iso-8859-1 ou iso-latin-1. les ee e franais ne sont pas de tr.

la ligature du franais a t oubli e ! c ee e Pour en savoir plus Il existe un excellent article de Jacques Andr et Michel Goosens sur les probl.s bons lobbyistes dans les instances internationales. et aussi c e incroyable que cela puisse para^tre.

mes de e e normalisation de codage de caract.

Pour le probl. librement accessible via l'url : e http: www.res. Il s'agit de la revue  les cahiers  de GUTenberg  .univ-rennes1. et l'article en question est dans le cahier 20.fr pub gut publications .

me de la e ligature . voir le cahier 25. 171 .

A.2 Le code ascii Le jeu de caract.

res est form d'un ensemble de caract.

res de commandes et de carace e e t.

res graphiques. L'ensemble des caract.

res de commande est form de six familles : e e e commandes de format commande carriage return line feed backspace horizontal tabulation vertical tabulation space form feed nom CR LF BS HT VT SP FF Le nom carriage return arrive tout droit de l' poque des machines .

o. crire.

la e ae u position d' criture tait xe et o.

le papier tait port sur un chariot carriage e e u e e mobile. Le caract.

sans changer de ligne.re carriage return est la commande permettant de mettre la poe sition d' criture en d but de ligne. Le caract.

sans aller en d but de ligne. Pour obtee e nir l'e et de  passage .re line feed met e e e la position d' criture sur la ligne suivante.

la ligne  . il faut donc un caract.

re carriage return suivi a e d'un caract.

re line feed ou l'inverse. Dans le syst.

me unix. le caract.

re choisi par e e e convention comme signi ant  passage .

la ligne  est le caract.

re line feed. et c'est a a e .

la charge des pilotes de p riph riques de remplacer ce caract.

re logique par la suite e e e de caract.

res n cessaires pour obtenir un passage .

la ligne suivante. Prenons le cas e e a d'un pilote de terminal cran clavier : e en entr e : la convention habituelle est de faire un passage .

la ligne an appuyant e a sur la touche carriage return. envoie . e 2. Le pilote de terminal : 1. envoie au programme qui r alise la lecture un line feed.

l' cran en tant qu' cho de ce carriage return la s quence line feed a e e e suivi de carriage return. en sortie : le pilote de terminal transforme les line feed en line feed suivi de carriage return Par abus de langage. on utilise souvent le terme de newline pour d signer en r alit line feed. Mais qu'il soit bien clair que la norme e e e ansi ne comporte pas de caract. dans le monde C et ou unix.

re appel newline. e e commandes d'extension du code commande nom shift out SO shift in SI escape ESC Le caract.

re escape a t largement utilis par les concepteurs de terminaux crane ee e e clavier et d'imprimantes pour augmenter le nombre de commandes. La technique 172 .

consiste .

d nir des s quences d' chappement form es du caract.

re escape suivi d'un a e e e e e certains nombre de caract.

e Voici quelques s quences d' chappement du terminal cran-clavier vt100 : e e e s quence e escape 2A escape 4B escape 3C escape 1D commande de s paration e commande nom le separator FS group separator GS record separator RS unit separator US end of medium EM Ces caract.res ordinaires qui perdent leur signi cation habituelle.

res ont pour but de s parer les di rentes unit s d'information sur bandes e e e e magn tiques. Ils sont obsol.

les programmes d'archivage tar. cpio e e utilisant leur propre format sans faire appel a ces caract.tes de nos jours.

res. .

e commandes pour la communication synchrone commande start of header start of text end of text end of transmission end of transmitted block enquiry positive acknowledge negative acknowledge synchronisation data link escape null nom SOH STX ETX EOT ETB ENQ ACK NAK SYN DLE NUL s mantique e monter le curseur de 2 lignes descendre le curseur de 4 lignes d caler le curseur de 3 positions vers la droite e d caler le curseur de 1 position vers la gauche e Les 10 premi.

res commandes ont t cr es pour construire des trames de commue ee e nication entre machines reli es par des lignes synchrones. Elles sont compl.

tement e e obsol.

o.tes de nos jours.

les communications se font gr^ce .

des r seaux dont les e u a a e trames n'utilisent pas ces caract.

e La derni.res.

re commande null tait utile .

l' poque des t l imprimeurs dont le temps e e a e ee de retour du chariot tait plus grand que le temps d'impression d'un caract.

re quele e conque. Apr.

s avoir envoy un carriage return. il fallait envoyer plusieurs null en e e fonction de la vitesse de la ligne pour ^tre s^r que le chariot tait bien revenu en e u e d but de ligne ! e 173 .

commandes de p riph rique e e commande device control 1 device control 2 device control 3 device control 4 nom DC1 DC2 DC3 DC4 Ces caract.

res ont t pr vus pour donner des ordres sp ci ques .

Les codes device control taient utilis s pour commander ce lecteure e perforateur. De nos jours device control 3 et device control 1 sont utilis s sous les noms respectifs e de xon et xoff pour r aliser du contr^le de ux. A l' poque des t l imprimeurs. certains p riph e ee e e a e e riques. ceux-ci poss daient un lecteur-perforateur de e ee e ruban papier. Les caract.

e Lorsqu'un pilote de terminal cran-clavier g.res device control e o e 3 et device control 1 sont a ect s aux touches Control-q et Control-s du clavier.

e commandes diverses commande cancel substitute delete bell nom CAN SUB DEL BEL Il y a deux caract.re le contr^le de ux. l'utilisateur peut e e o taper Control-s pour faire stopper une sortie trop rapide pour se donner le temps de la lire sur l' cran. et la faire continuer en tapant Control-q.

res qui sont utilis s couramment pour r aliser la fonction d'e acee e e ment du caract.

re erron  pr c dent : back space et delete. En fonction du caract.

re e e ee e qui est le plus facile .

l'utilisateur d sirera choisir l'un ou a e l'autre. Le caract. taper sur son clavier.

re back space peut sur tout clavier s'obtenir par Control-h. alors e qu'il n'y a pas de Control-quelque-chose correspondant au caract.

ou une touche marqu e  qui g n. il peut y avoir une touche marqu e back space. et ou une touche marqu e e e delete. Selon les e claviers.re delete.

ou ne e ee peut pas.re back space ou delete. et qui peut. ^tre con gur e par le set-up du terminal pour g n rer au choix back space e e ee ou delete ! Un utilisateur unix utilise la commande stty pour indiquer au syst.

me d'exploitae tion le caract.

re qu'il d sire pour r aliser la fonction d'e acement de caract.

e e e e 174 .re.

4  5 = E M U e m u F N V ^ f n v ~ & . 0x30 0 1 2 3 4 5 6 7 8 9 : . = ? 0x40 @ A B C D E F G H I J K L M N O 0x50 P Q R S T U V W X Y Z ^ _ 0x60 ` a b c d e f g h i j k l m n o 0x70 p q r s t u v w x y z | ~ del 175 .1 Les codes ascii en octal code 000 010 020 030 040 050 060 070 100 110 120 130 140 150 160 170 nul bs dle can sp  0 8 @ H P X ` h p x 0 soh ht dc1 em !  1 9 A I Q Y a i q y 1 stx lf dc2 sub " * 2 : B J R Z b j r z 2 etx eot enq ack bel vt np cr so si dc3 dc4 nak syn etb esc fs gs rs us  + 3 .A. .2 Les codes ascii en hexad cimal e code 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00 nul soh stx etx eot enq ack bel bs ht lf vt np cr so si 0x10 dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us 0x20 sp ! "  $  & '   * + . C K S c k s D L T d l t | $ .2.2. 6 7 ? G O W _ g o w ' 3 4 5 6 7 del A..

E O Y c m w del 176 .3 Les codes ascii en d cimal e code 0 10 20 30 40 50 60 70 80 90 100 110 120 0 1 2 3 4 5 6 7 8 9 nul lf dc4 rs  2 F P Z d n x soh vt nak us  3 = G Q e o y stx etx eot enq ack bel bs ht np cr so si dle dc1 dc2 dc3 syn etb can em sub esc fs gs sp ! "  $  & ' * 4 H R f p z + 5 ? I S g q . 8 B L V ` j t ~ 9 C M W a k u 0 : D N X b l v 1 .A. 6 @ J T ^ h r | 7 A K U _ i s .2.

6 > F N V ^ f n v ~ ’ / 7 ? G O W _ g o w DEL ı ¨ ¨ ° ¸ À È Ð Ø à è ð ø ` ¡ © ± ¹ Á É Ñ Ù á é ñ ù ´ ˆ ˚ ¸ ¢ £ ª « ² ³ º » Â Ã Ê Ë Ò Ó Ú Û â ã ê ë ò 177 ó ú û ˜ ¤ ¬ ´ ¼ Ä Ì Ô Ü ä ì ô ü ¯ ˝ ¥ µ ½ Å Í Õ Ý å í õ ý ˘ ˛ ¦ ® ¶ ¾ Æ Î Ö Þ æ î ö þ ˙ ˇ § ¯ · ¿ Ç Ï × ß ç ï ÷ ÿ . 4 < D L T \ d l t | % − 5 = E M U ] e m u } & .3 Les codes ISO-Latin-1 octal 0000 0010 0020 0030 0040 0050 0060 0070 0100 0110 0120 0130 0140 0150 0160 0170 0200 0210 0220 0230 0240 0250 0260 0270 0300 0310 0320 0330 0340 0350 0360 0370 0 NUL BS DLE CAN SP 1 SOH HT DC1 EM 2 STX LF DC2 SUB 3 ETX VT DC3 ESC 4 EOT NP DC4 FS 5 ENQ CR NAQ GS 6 ACK SO SYN RS 7 BEL SI ETB US ( 0 8 @ H P X ‘ h p x ! ) 1 9 A I Q Y a i q y " * 2 : B J R Z b j r z # + 3 .A. C K S [ c k s { $ .

178 .

Annexe B Bibliographie Il existe de tr.

e Le livre sur C crit par les concepteurs du langage. 1 Brian W. The C programming language. Kernighan and Dennis M. 1988. Je ne donnerai ici que les livres qui sont extraordinaires pour une raison ou une autre. seconde dition. La seconde dition est conforme au e e standard ansi. Prentice Hall. alors que la premi. Ritchie.s nombeux livres sur le langage C. Il su t de se rendre dans une fnac e quelconque pour en trouver des rayons entiers.

C a reference manual. quatri.re dition m^me titre. Steele. 2 Samuel P. Prentice hall. Harbison et Guy L. m^mes auteurs d nissait le e e e e e langage C dans sa version dite Kernighan et Ritchie".

e Il y a un consensus sur Internet pour estimer que ce livre est la meilleure r f rence sur le ee langage C. 1995.me e dition. C'est le livre dont un programmeur doit disposer d.

s qu'il a d pass le stade e e e d'apprentissage du langage. 3 Herbert Schildt. Malheureusement. Schildt tait excellente : donner le texte complet de la norme accompagn de e e e commentaires permettant de l' clairer. The annotated ANSI C standard. 1993 L'id e de H. Osborne McGraw-Hill. le r sultat est consid r comme e e ee tant tr.

s mauvais par pratiquement tout le monde sur Internet : les annotations de l'auteur e e sont consid r es comme tant sans int ret. Il y a cependant une raison de se procurer ce ee e e livre : obtenir au prix d'un livre le texte o ciel d'une norme qui coute tr.

s cher si on se la e procure directement aupr.

On peut se procurer ce texte aupr. e Pour les personnes qui doivent disposer du texte o ciel de la norme avec les derniers amendements.s des organismes normalisateurs.

de d s de programmation. Consulter http: www.fr. de r cit de bugs d sastreux etc.afnor. d' tudes fouill es de certains points di ciles e e e e du langage. C'est un m lange d'anecdotes. 4 International Standard ISO IEC 9899:1990 Programming languages C 5 Peter Van der Linden Expert C programming. ni un manuel de r f rence pour programee meur con rm .A Prentice Hall Title 179 .s de l'afnor. e Ce livre n'est ni un livre pour apprendre le langage. Sun Soft Press . Se lit davantage e e e comme un roman que comme un livre technique.

180 .

answers C-faq faq.c maintenue par Steve Summit dont l'url est ftp: rtfm.edu: pub usenet news.c. fr.lang.Annexe C Ressources Internet Les ressources Internet se composent essentiellement de : deux forums de discussion: comp. e e Un document intitul Learn C C++ today a list of resources tutorials dont e l'url est ftp: On y trouve les url de ressources librement accessibles sur Internet. C'est le recueil des questions les plus fr quemment pos es dans le forum comp.c : forum international donc en langue anglaise de discussion sur le langage C.lang.lang.c : forum franais de discussion sur le langage C.lang.comp. c deux faq Frequently Asked Questions : La faq de comp.mit. .

savoir : a des documents .

des documents . imprimer.

edu: pub usenet news.mit.answers C-faq learn-c-cpp-today. consulter avec un browser web. a a des exemples de programmes. e rtfm. une bibliographie comment e. 181 .

182 .

Annexe D La grammaire D.1 Les unit s lexicales e R1 unit -lexicale : e  mot-cl e  identi cateur  constante  cha^ne-litt rale e  op rateur e  ponctuation unit -lexicale-du-pp : e  nom.chier-inclusion  identi cateur  nombre-du-pp  constante-caract.

re e  cha^ne-litt rale e  op rateur e  ponctuation  tout caract.

re non blanc qui ne peut ^tre une des entit s pr c dentes e e e ee R2 D.2 Les mots-cl s e R3 mot-cl : un parmi e auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 183 .

4 Les constantes R7 constante :  constante.ottante  constante-enti.D.3 Les identi cateurs R4 identi cateur :  non-chi re  identi cateur non-chi re  identi cateur chi re non-chi re : un parmi _ a n A N b o B O c p C P d q D Q e r E R f s F S g t G T h u H U i v I V j w J W k x K X l y L Y m z M Z R5 R6 chi re : un parmi 0 1 2 3 4 5 6 7 8 9 D.

re e  constante-d- num ration e e  constante-caract.

ottant option e partie-fractionnaire :  s quence-de-chi res option e  s quence-de-chi res .re e constante. R8 R9 R10 R11 R12 R13 s quence-de-chi res e partie-exposant :  e signe option s quence-de-chi res e  E signe option s quence-de-chi res e signe : un parmi + - s quence-de-chi res : e  chi re  s quence-de-chi res chi re e su xe.ottant option  s quence-de-chi res partie-exposant su xe.ottant : un parmi f l F L 184 .ottante :  partie-fractionnaire partie-exposant option su xe. e .

R14 constante-enti.

re : e  constante-d cimale su xe-entier option e  constante-octale su xe-entier option  constante-hexad cimale su xe-entier option e constante-d cimale : e  chi re-non-nul  constante-d cimale chi re e constante-octale : R15 R16 R17  0  constante-octale chi re-octal constante-hexad cimale : e  0x chi re-hexad cimal e  0X chi re-hexad cimal e  constante-hexad cimale chi re-hexad cimal e e chi re-non-nul : un parmi 1 2 3 4 5 6 7 8 9 R18 R19 R20 R21 R22 R23 R24 R25 R26 chi re-octal : un parmi 0 1 2 3 4 5 6 7 chi re-hexad cimal : un parmi e 0 a 1 b 2 c 3 d 4 e 5 f 6 A 7 B 8 C 9 D E F su xe-entier :  su xe-non-sign su xe-long option e  su xe-long su xe-non-sign option e su xe-non-sign : un parmi e u U su xe-long : un parmi l L constante-d- num ration : e e  identi cateur constante-caract.

re : e  ' s quence-de-caract.

res-c e e  L' s quence-de-caract.

res-c e e s quence-de-caract.

res-c : e e  caract.

re-c e ' ' 185 .

 s quence-de-caract.

res-c caract.

re-c e e e R27 caract.

re-c : e  n'importe quel membre du jeu de caract.

res source sauf le quote ' e le backslash   ou le newline  s quence-d- chappement e e s quence-d- chappement : e e  s quence-d- chappement-simple e e  s quence-d- chappement-octale e e  s quence-d- chappement-hexad cimale e e e s quence-d- chappement-simple : un parmi e e ' a " b ? f n r t v R28 R29 R30 s quence-d- chappement-octale : e e  chi re-octal  chi re-octal chi re-octal  chi re-octal chi re-octal chi re-octal s quence-d- chappement-hexad cimale : e e e  x chi re-hexad cimal e  s quence-d- chappement-hexad cimale chi re-hexad cimal e e e e R31 D.5 Les cha^nes litt rales e R32 R33 R34 cha^ne-litt rale : e  " s quence-de-caract.

res-s option e e  L" s quence-de-caract.

res-s option e e " " s quence-de-caract.

res-s : e e  caract.

re-s e  s quence-de-caract.

res-s caract.

re-s e e e caract.

re-s : e  n'importe quel membre du jeu de caract.

- 186 .res source sauf le double quote " e le backslash   ou le newline  s quence-d- chappement e e D.6 Les op rateurs e R35 op rateur : un parmi e   .

.++ ? = .chier-inclusion :  s quence-de-caract. ..7 La ponctuation R36 ponctuation : un parmi   * .  D.&  : *= =   * + - ~ = ! sizeof = == != = = &= ^ | && |= || = += -= ^= D. : = .8 Nom de chier d'inclusion R37 R38 R39 R40 R41 nom. -.

res-h e e  " s quence-de-caract.

res-q e e " s quence-de-caract.

res-h : e e  caract.

re-h e  s quence-de-caract.

res-h caract.

re-h e e e caract.

re-h : e  n'importe quel membre du jeu de caract.

res source sauf ou le newline e s quence-de-caract.

res-q : e e  caract.

re-q e  s quence-de-caract.

res-q caract.

re-q e e e caract.

re-q : e  n'importe quel membre du jeu de caract.

187 . chi re  nombre-du-pp chi re  nombre-du-pp non-chi re  nombre-du-pp e signe  nombre-du-pp E signe  nombre-du-pp .res source sauf " ou le newline e D.9 Les nombres du pr processeur e R42 nombre-du-pp :  chi re  .

++ -- expression liste-d-expressions-param.D.10 Les expressions R43 expression-primaire :  identi cateur  constante  cha^ne-litt rale e   expression  R44 expression-post x e : e  expression-primaire  expression-post x e e  expression-post x e e  expression-post x e e  expression-post x e e  expression-post x e e  expression-post x e e  .

tres option e identi cateur identi cateur  R45 R46 liste-d-expressions-param.

tres : e  expression-a ectation  liste-d-expressions-param.

tres e .expression-unaire  op rateur-unaire expression-cast e  sizeof expression-unaire  sizeof  nom-de-type  op rateur-unaire : un parmi e & * + ~ ! R47 R48 R49 expression-cast :  expression-unaire   nom-de-type  expression-cast expression-cast expression-cast expression-cast expression-multiplicative :  expression-cast  expression-multiplicative  expression-multiplicative  expression-multiplicative *  R50 expression-additive :  expression-multiplicative  expression-additive + expression-multiplicative  expression-additive .expression-multiplicative 188 . expression-a ectation expression-unaire :  expression-post x e e  ++ expression-unaire  -.

R51 expression-d calage : e  expression-additive  expression-d calage e  expression-d calage e expression-relation :  expression-d calage e  expression-relation  expression-relation  expression-relation  expression-relation expression-additive expression-additive expression-d calage e expression-d calage e expression-d calage e expression-d calage e R52 = = R53 expression- galit : e e  expression-relation  expression- galit == expression-relation e e  expression- galit != expression-relation e e expression-et :  expression- galit e e  expression-et & expression- galit e e expression-ou-exclusif :  expression-et  expression-ou-exclusif expression-ou-inclusif :  expression-ou-exclusif  expression-ou-inclusif expression-et-logique :  expression-ou-inclusif  expression-et-logique expression-ou-logique :  expression-et-logique  expression-ou-logique expression-conditionnelle :  expression-ou-logique  expression-ou-logique expression-et expression-ou-exclusif expression-ou-inclusif expression-et-logique expression-conditionnelle R54 R55 R56 R57 R58 R59 R60 R61 ^ | && || ? expression : expression-a ectation :  expression-conditionnelle  expression-unaire op rateur-a ectation expression-a ectation e op rateur-a ectation : un parmi e = *= = = += -= = = &= ^= |= 189 .

R62 R63 expression :  expression-a ectation  expression . expression-a ectation expression-constante :  expression-conditionnelle D.11 Les d clarations e R64 R65 d claration : e  sp ci cateurs-de-d claration liste-de-d clarateurs-init option e e e . sp ci cateurs-de-d claration : e e  sp ci cateur-de-classe-m moire sp ci cateurs-de-d claration option e e e e  sp ci cateur-de-type sp ci cateurs-de-d claration option e e e  quali catif-de-type sp ci cateurs-de-d claration option e e liste-de-d clarateurs-init : e  d clarateur-init e  liste-de-d clarateurs-init e d clarateur-init : e  d clarateur e  d clarateur e d clarateur-init e R66 R67 R68 . = initialisateur sp ci cateur-de-classe-m moire : e e      auto extern static register typedef R69 sp ci cateur-de-type : e  void  char  short  int  long  float  double  signed  unsigned  sp ci cateur-de-struct-ou-union e  sp ci cateur-d- num ration e e e 190 .

: expression-constante liste-d- num rateurs e e sp ci cateur-d- num ration : e e e  enum identi cateur option  enum identi cateur liste-d- num rateurs : e e  num rateur e e  liste-d- num rateurs e e . num rateur e e expression-constante num rateur : e e  constante-d- num ration e e  constante-d- num ration e e quali catif-de-type : =   const volatile d clarateur : e  pointeur option d clarateur-direct e 191 . . nom-de-typedef R70 R71 R72 R73 R74 R75 R76 R77 R78 R79 R80 R81 sp ci cateur-de-struct-ou-union : e  struct-ou-union identi cateur option  struct-ou-union identi cateur struct-ou-union : liste-de-d clarations-de-struct e   struct union liste-de-d clarations-de-struct : e  d claration-de-struct e  liste-de-d clarations-de-struct d claration-de-struct e e d claration-de-struct : e  liste-de-sp ci cateurs-et-quali catifs liste-de-d clarateurs-de-struct e e liste-de-sp ci cateurs-et-quali catifs : e  sp ci cateur-de-type liste-de-sp ci cateurs-et-quali catifs option e e  quali catif-de-type liste-de-sp ci cateurs-et-quali catifs option e liste-de-d clarateurs-de-struct : e  d clarateur-de-struct e  liste-de-d clarateurs-de-struct e d clarateur-de-struct : e  d clarateur e  d clarateur option e d clarateur-de-struct e .

R82 d clarateur-direct : e  identi cateur   d clarateur  e  d clarateur-direct e  d clarateur-direct e  d clarateur-direct e pointeur :   expression-constante option liste-de-types-de-param.

tres e liste-d-identi cateurs option   R83 R84 R85 R86 R87 R88 R89 R90 R91   * * liste-de-quali catifs-de-types option liste-de-quali catifs-de-types option pointeur liste-de-quali catifs-de-types :  quali catif-de-type  liste-de-quali catifs-de-types quali catif-de-type liste-de-types-de-param.

tres : e  liste-de-param.

tres e  liste-de-param.

... liste-de-param.tres e .

tres : e  d claration-de-param.

tre e e  liste-de-param.

tres . d claration-de-param.

tre e e e d claration-de-param.

tre : e e  sp ci cateurs-de-d claration d clarateur e e e  sp ci cateurs-de-d claration d clarateur-abstrait option e e e liste-d-identi cateurs :  identi cateur  liste-d-identi cateurs identi cateur . nom-de-type :  liste-de-sp ci cateurs-et-quali catifs d clarateur-abstrait option e e d clarateur-abstrait : e  pointeur  pointeur option d clarateur-abstrait-direct e d clarateur-abstrait-direct : e   d clarateur-abstrait  e  d clarateur-abstrait-direct option e  d clarateur-abstrait-direct option e nom-de-typedef :  identi cateur expression-constante option liste-de-types-de-param.

tres option e   R92 192 .

12 Les instructions R95 instruction :  instruction- tiquett e e e  instruction-compos e e  instruction-expression  instruction-s lection e  instruction-it ration e  instruction-saut instruction- tiquett e : e e  identi cateur : instruction  case expression-constante : instruction  default : instruction instruction-compos e : e  liste-de-d clarations option liste-d-instructions option e liste-de-d clarations : e  d claration e  liste-de-d clarations d claration e e liste-d-instructions :  instruction  liste-d-instructions instruction instruction-expression :  expression option .R93 initialisateur :  expression-a ectation  liste-d-initialisateurs  liste-d-initialisateurs liste-d-initialisateurs :  initialisateur  liste-d-initialisateurs . R94 . initialisateur D. R96 R97 R98 R99 R100 R101 instruction-s lection : e  if  expression  instruction  if  expression  instruction else instruction  switch  expression  instruction instruction-it ration : e R102  while  expression  instruction 193 .

  R103 do instruction while  for  expression option . expression option  instruction-saut :     goto identi cateur . instruction expression  . continue . expression option . return expression option . break .14 Directives du pr processeur e R107 R108 R109 chier-du-pp :  groupe option groupe :  partie-de-groupe  groupe partie-de-groupe partie-de-groupe :  liste-d-unit s-lexicales-du-pp option newline e  section-if  ligne-directive section-if : groupe-if : R110 R111  groupe-if liste-de-groupes-elif option groupe-else option ligne-endif   if expression-constante newline groupe option ifdef identi cateur newline groupe option   194 . D.13 D nitions externes e R104 R105 R106 unit -de-compilation : e  d claration-externe e  unit -de-compilation d claration-externe e e d claration-externe : e  d nition-de-fonction e  d claration e d nition-de-fonction : e  sp ci cateurs-de-d claration option d clarateur liste-de-d clarations option e e e e instruction-compos e e D.

 R112 R113 R114 R115 R116  ifndef identi cateur newline groupe option liste-de-groupes-elif :  groupe-elif  liste-de-groupes-elif groupe-elif groupe-elif :   elif expression-constante newline groupe option newline groupe option newline groupe-else :   else ligne-endif :   endif ligne-directive :         R117 R118 R119 R120 liste-d-unit s-lexicales-du-pp newline e identi cateur remplacement newline identi cateur parenth.

se-g liste-d-identi cateurs option e remplacement newline  undef identi cateur newline  line liste-d-unit s-lexicales-du-pp newline e  error liste-d-unit s-lexicales-du-pp option newline e  pragma liste-d-unit s-lexicales-du-pp option newline e  newline    include define define parenth.

se-g : e  le caract.

re  non pr c d d'un espace blanc e eee remplacement :  liste-d-unit s-lexicales-du-pp option e liste-d-unit s-lexicales-du-pp : e  unit -lexicale-du-pp e  liste-d-unit s-lexicales-du-pp unit -lexicale-du-pp e e newline :  le caract.

re s parateur de lignes e e 195 .

15 R f rences crois es de la grammaire ee e caract.D.

re-c e caract.

re-h e caract.

re-q e caract.

re-s e cha^ne-litt rale e chi re chi re-hexad cimal e chi re-non-nul chi re-octal constante constante-caract.

re e constante-d- num ration e e constante-d cimale e constante-enti.

re e constante.ottante constante-hexad cimale e constante-octale d clarateur e d clarateur-abstrait e d clarateur-abstrait-direct e d clarateur-de-struct e d clarateur-direct e d clarateur-init e d claration e d claration-de-param.

113 51 51. 106 90 87. 91 91 90. 82 87. 79. 30 7 1. 31 18 15 19 16. 55 57 57. 48. 54 54 54. 93 48 46. 49 59 59. 58 49 49. 56 56 56. 59 44 44. 79 15 14. 62. 7 24 7. 111. 101. 59. 82 67 66 64 98. 17 16 14 81 67. 15 14 7 87 17 14. 102. 63 63 76. 43 6 4. 96. 50 55 55.tre e e d claration-de-struct e d claration-externe e d nition-de-fonction e num rateur e e expression expression-additive expression-a ectation expression-cast expression-conditionnelle expression-constante expression-d calage e expression- galit e e expression-et expression-et-logique expression-multiplicative expression-ou-exclusif expression-ou-inclusif expression-ou-logique expression-post x e e expression-primaire 27 26 39 38 41 40 34 33 2 1. 51 60 45. 60. 62. 52 53 53. 103 50 50. 76. 60. 44. 82. 89. 42 20 17. 43 25 2. 91. 100. 57 58 58. 2. 46 43 44 196 . 91 76 75 82 81. 105 87 86 73 72 105 104 106 105 79 78 62 43.

expression-relation expression-unaire chier-du-pp groupe groupe-elif groupe-else groupe-if identi cateur initialisateur instruction instruction-compos e e instruction- tiquett e e e instruction-expression instruction-it ration e instruction-saut instruction-s lection e ligne-directive ligne-endif liste-d- num rateurs e e liste-de-d clarateurs-de-struct e liste-de-d clarateurs-init e liste-de-d clarations e liste-de-d clarations-de-struct e liste-de-groupes-elif liste-de-param.

tres e liste-de-quali catifs-de-types liste-de-sp ci cateurs-et-quali catifs e liste-de-types-de-param.

tres e liste-d-expressions-param.

tres e liste-d-identi cateurs liste-d-initialisateurs liste-d-instructions liste-d-unit s-lexicales-du-pp e mot-cl e newline nom-de-type nom-de-typedef nom.chier-inclusion nombre-du-pp non-chi re op rateur e op rateur-a ectation e op rateur-unaire e parenth.

115. 108. 89 85 82. 94 95 96. 48. 77. 42 5 4. 116 89 46. 78 75 73. 92. 42 5 1. 102 97 95. 106 96 95 100 95 102 95 103 95 101 95 116 109 115 110 78 77. 2 61 60 47 46 117 116 109 108 10 8 98 197 . 114. 15. 111. 118. 119 31 120 27. 94 99 97. 116 93 67. 86 84 83. 84 74 73. 48 92 69 37 2 42 2. 113. 4. 109. 60 107 108 107. 44. 82 88. 106 72 70. 103. 75 66 64. 45 88 82. 116 94 93. 72 112 110. 111. 101. 99. 70. 43. 88. 66 98 97. 96. 24. 99 119 109. 91 45 44. 2.se-g e partie-de-groupe partie-exposant partie-fractionnaire 52 52. 111. 112 86 85. 114 113 112 114 110 111 110 4 1. 53 46 46. 98. 116. 113. 74.

pointeur ponctuation quali catif-de-type remplacement section-if s quence-de-caract.

res-c e e s quence-de-caract.

res-h e e s quence-de-caract.

res-q e e s quence-de-caract.

res-s e e s quence-d- chappement e e s quence-d- chappement-hexad cimale e e e s quence-d- chappement-octale e e s quence-d- chappement-simple e e s quence-de-chi res e signe sp ci cateur-d- num ration e e e sp ci cateur-de-classe-m moire e e sp ci cateur-de-struct-ou-union e sp ci cateur-de-type e sp ci cateurs-de-d claration e e struct-ou-union su xe-entier su xe. 74. 42 77 69 68 65 70 69 69 65. 83. 106 71 70 21 14 13 8 23 21 22 21 104 104 1 2 119 198 . 74 65 64. 90 36 1. 38 40 37. 10 11 10.ottant su xe-long su xe-non-sign e unit -de-compilation e unit -lexicale e unit -lexicale-du-pp e 83 81. 2 80 65. 40 33 32. 31 30 28 29 28 12 8. 9. 33 28 27. 84 118 116 110 109 26 25. 26 38 37. 34 31 28. 65. 87.

1 Les types de base formes quivalentes e short short int signed short signed short int int signed signed int long long int signed long signed long int unsigned short unsigned short int unsigned unsigned int unsigned long unsigned long int char signed char unsigned char float double long double forme pr f r e eee short int s mantique e entier court entier entier long entier court non sign e entier non sign e entier long non sign e caract.Annexe E Un bestiaire de types E.

re e caract.

re sign e e caract.

re non sign e e ottant simple pr cision e ottant double pr cision e ottant quadruple pr cision e int long int unsigned short int unsigned int unsigned long int 199 .

7.y. struct complex t 3 = 1. j. 12. 3 . 11. 2.4 . "mardi". &r3 . 0. 12 . int t 24 80 . 10. "mercredi".2 . r3.2 Les tableaux int tab 10 . int tab 5 = 10. . 13. &k . struct complex * t 10 . . k. struct complex float x. 1. int t1 2 3 = 0. int *t 3 = &i.5. struct complex *t = &r1. struct complex float x. . struct complex t 10 . int *t 10 . r2.y. struct complex float x. 3. int f1int a * corps de la fonction * tableau de 10 entiers tableau de 5 entiers avec initialisation tableau de 80 caract. 2 . 11. . char mes 80 . 1. char *t = "lundi". int *t 10 int.y.E. 14 .y. struct complex float x. . &r2. &j. struct complex r1. int i. char mess = "Erreur de syntaxe".

res e tableau de caract.

res avec initialisation e tableau .

deux dimensions a tableau .

deux dimensions avec initialisation a tableau de pointeurs vers des entiers tableau de pointeurs vers des entiers avec initialisation tableau de pointeurs vers des caract.

f2 . 200 .res e avec initialisation tableau de structures tableau de structures avec initialisation tableau de pointeurs vers des structures tableau de pointeurs vers des structures avec initialisation tableau de pointeurs vers des fonctions int f2int a * corps de la fonction * tableau de pointeurs vers des fonctions avec initialisation int *t 2 int = f1.

struct complex float x.y. int *p = &i.3 Les pointeurs int *p. int fint a * corps de la fonction * . struct complex c. void *pint.y.float.E. struct complex *p = &c. int **p. struct complex *p. struct complex float x. int *pint. int **p = &q. int *pint. int *q. int i. pointeur vers un entier pointeur vers un entier avec initialisation pointeur vers un pointeur vers un entier pointeur vers un pointeur vers un entier avec initialisation pointeur vers une structure pointeur vers une structure avec initialisation pointeur vers une fonction ayant un param. .

tre entier et retournant un entier e pointeur vers une fonction ayant un param.

tre entier et un param.

tre ottant et e e retournant un entier pointeur vers une fonction ayant un param.

tre entier et ne retournant pas de valeur e pointeur vers une fonction ayant un param.

avec e initialisation int *pint = f.tre entier et retournant un entier. E.4 Les fonctions void fvoid * corps de la fonction * fonction sans param.

tre et sans valeur ree tourn e e fonction avec un param.

sans vae leur retourn e e fonction sans param.tre entier.

tre retournant un int e fonction avec un param.

tre entier et un e param.

retournant un int e fonction avec un param.tre ottant.

tre entier et un e nombre variable de param.

. float b * corps de la fonction * int fint a. . retoure nant un int 201 void fint a * corps de la fonction * int fvoid * corps de la fonction * int fint a.tres. * corps de la fonction * ..

struct sr unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned . struct float x.6 Les structures. blanc = 1 et rouge = 2 = 0. * partie r elle e float y. u. unions et champs de bits struct complex float x. enum coul bleu. blanc. struct complex float x. * partie r elle e float y. enum type ENTIER. union int i. enum coul bleu=3. blanc=5.E. FLOTTANT struct arith enum type typ_val. blanc = 10 et rouge = 11 = 3. blanc = 5 et rouge = 9 E. * partie r elle e float y. * partie imaginaire c1. rouge . * partie imaginaire c. . rouge=9 . c2. blanc=10.5 Les num rations e e enum coul bleu. * partie imaginaire . * * Structure . float f. bleu bleu bleu = 0. rouge .

e Structure . deux champs ottants. D a e nit l' tiquette de structure complex sans e d clarer de variable.

Structure . deux champs ottants. D nit a e l' tiquette de structure complex et d clare e e les deux variables c1 et c2.

D a e clare la variable c sans d nir d' tiquette e e pour la structure. Union d'un type entier et d'un type ottant associ dans une structure a un indie . deux champs ottants.

negative : 1. Les troisi. extend : 1. priv : 2. : 3. masque : 3. Champs de bits : description du registre d' tat du mc68000. cateur le champ typ_val permettant de connaitre le type de la valeur stock e dans e l'union u. z ro : 1. * * * * int int int int int int int int int int trace : 2. e overflow : 1. : 1. carry : 1. Il s'agit d'un mot de e 16 bits.

me et cinqui.

202 .me champs e e ne portent pas de nom.

const p. const int t 5 . int * const p. e const const int * const int i. e e l'utilisation de volatile tant rigoureusement identique. Pointeur constant vers un entier constant. int y. Pointeur constant vers un entier. const struct coord s. . Structure constante : tous les champs de s sont constants. Entier constant Pointeur vers un entier constant.7 Les quali catifs Il y a deux quali catifs : const et volatile Les exemples pr sent s sont avec const. struct coord int x. int *p. Tableau constant : tous les l ments de t ee sont constants.E. 203 .

204 .

La caract ristique de beaucoup de ces erreurs est de ne pas provoquer e e e de message d'erreur du compilateur.Annexe F Le b^tisier e Cette annexe est une collection des b^tises qu'il faut faire au moins une fois dans sa vie e pour ^tre vaccin . rendant ainsi leur d tection di cile. La di rence e e entre le texte correct et le texte erron est souvent seulement d'un seul caract.

re. La e e d couverte de telles erreurs ne peut donc se faire que par un examen tr.

F.1 Erreur avec les op rateurs e F.1.s attentif du e e source du programe.1 Erreur sur une comparaison Ce que voulait le programmeur Ce qu'il aurait d^ crire ue Ce qu'il a crit e Ce qu'il a obtenu Comparer a et b if a == b if a = b une a ectation de b .

suivie d'une a comparaison . a.

e F. e Comment est ce possible? L'a ectation est un op rateur et non pas une instruction.2 Erreur sur l'a ectation C'est le pendant de l'erreur pr c dente. ee Ce que voulait le programmeur Ce qu'il aurait du crire e Ce qu'il a crit e Ce qu'il a obtenu A ecter b .1. 0 de la valeur a eca t e.

La comparaison de a . a a a = b. a == b.

suivie de a l'inutilisation du r sultat. e Comment est ce possible? Une d rivation possible pour instruction est : e instruction : 205 . b.

mais rien ne e l'impose dans la d nition du langage. Le traitement des macros est un pur traitement textuel. sans aucun contexte . Pour que cela ait un sens. e F. il faut que l'expression r alise un e et de bord. . c'est un nid a erreurs.2 Erreurs avec les macros Le m canisme des macros est r alis par le pr processeur qui r alise un traitement en e e e e e amont du compilateur proprement dit. expression option .

Ce qu'il aurait du crire e define MAX 10 Cette erreur peut provoquer ou non une erreur de compilation .2.1 Un define n'est pas une d claration e Ce que le programmeur a crit e define MAX 10. F.

aura pour expansion x instruction nulle derri. l'utilisation de la a macro : L'utilisation x = MAX.

MAX . = 10. ce qui est licite : il y a une ce qui g n.... e L'utilisation int t message d'erreur.re x = 10.

rera un ee aura pour expansion int t 10.2 Un define n'est pas une initialisation Ce que le programmeur a crit e define MAX = 10 Ce qu'il aurait du crire e define MAX 10 Cette erreur sera g n ralement d tect e . . F.2.

malheureusement le message ee e e a d'erreur sera mis sur l'utilisation de la macro. la compilation. et non pas l.

o.

a savoir la e a u e . r side l'erreur.

d nition de la macro.2.3 Erreur sur macro avec param. e F.

tres e La distinction entre macro avec param.

tres et macro sans param.

tre se fait sur la e e pr sence d'une parenth.

se ouvrante juste apr.

b a + b define add a.b a + b param. sans aucun blanc e e e entre les deux. comparer les deux exemples e suivants : D nition de la macro e define adda. Ceci peut amener des r sultats surprenant .s le nom de la macro.

tres corps de la macro e a et b a + b aucun a.b a + b 206 .

2.F.4 Erreur avec les e ets de bord Le corps d'une macro peut comporter plusieurs occurrences d'un param.

tre. Si a l'utie .

lisation de la macro on r alise un e et de bord sur le param.

cet e et de bord e e sera r alis plusieurs fois. e x++ * x++ et l'op rateur e ++ F. ni terminateur e pas de fi dans le style des if then else . Exemple : e e define CARREa a * a l'utilisation de CARREx++ aura comme expansion sera appliqu deux fois.tre e ectif. Ce qu'il aurait du crire e if  a b a = b.3 Erreurs avec l'instruction if L'instruction if ne comporte ni mot-cl introducteur de la partie then. a = b. Ceci peut provoquer les erreurs suivantes : Ce que le programmeur a crit e if  a b . Le probl.

e Ce que le programmeur a crit e if a b if  x else . y x = y. On rappelle qu'un else est raccroch au premier if. e F.me vient aussi du fait de l'existence de l'instruction nulle.4 Erreurs avec les commentaires Il y a deux erreurs classiques avec les commentaires : 1... Le compilateur mange" donc tout e le texte jusqu'. Ce qu'il aurait du crire e if a b if  x else .. y x = y. le programmeur oublie la s quence fermante *..

a n'aura pas l'e et escompt par le programmeur.. On veut enlever en le mettant en commentaire un gros bloc d'instructions sans prendre garde au fait qu'il comporte des commentaires.. Les commentaires ne pouvant ^tre imbriqu s. La m thode e e c e e classique pour enlever tout en le laissant dans le source un ensemble d'instructions est d'utiliser le pr processeur : e ifdef NOTDEFINED . la s quence fermante du prochain commentaire. endif 207 . a e 2.

5 Erreurs avec les priorit s des op rateurs e e Les priorit s des op rateurs sont parfois surprenantes. Les cas les plus g^nants sont les e e e suivants : La priorit des op rateurs bit .F.

bit est inf rieure a celle des op rateurs de comparaie e a e .

Le programmeur a crit il d sirait e e il a obtenu x & 0xff == 0xac x & 0xff == 0xac x & 0xff == 0xac La priorit des op rateurs de d calage est inf rieure a celle des op rateurs arithm e e e e . e son.

Le programmeur a crit il d sirait e e x 4 + 0xf x 4 + 0xf il a obtenu x 4 + 0xf La priorit de l'op rateur d'a ectation est inf rieure a celle des op rateurs de come e e . e e tiques.

Dans la s quence ci-dessous. tr. e paraison.

toutes les parenth.s souvent utilis e.

1 Oubli du break L'instruction de s lection a pour syntaxe : instruction-s lection : e e  switch  expression  instruction La notion d'alternative de la s lection n'appara^t pas dans la syntaxe : le programmeur e doit les r aliser par une liste d'instruction tiquett e par case expression-constante et e e e termin e par break..6 Erreur avec l'instruction switch F. une catastrophe s'ensuit.6.ses e e e e sont n cessaire : e while c = getchar != EOF . e F. F. Si une faute .6. En cas d'oubli du break..2 Erreur sur le default L'alternative a ex cuter par d faut est introduite par l' tiquette default.

l'alternative par d faut ne sera plus reconnue : e e l' tiquette sera prise pour une tiquette d'instruction sur laquelle ne sera fait aucun goto. * erreur non d tect e e e * Une version diabolique de cette erreur est relat e dans le livre de Peter Van Der e Linden : si la lettre l de default est remplac e par le chi re 1. avec les fontes utilis es e e pour imprimer les sources. qui verra la di rence entre l et 1 ? e 208 . defult : return1. e e switcha case 1 : a = b. e e e de frappe est commise sur cette tiquette.

7 Erreur sur les tableaux multidimensionnels La r f rence .F.

un tableau t .

elle pourra ^tre accept e par le e e compilateur. si on utilise par erreur la notation t i.j selon le contexte d'utilisation. dans cette expression la virgule est l'op rateur qui d livre comme e e r sultat l'op rande droit apr. deux dimensions s' crit t i j et non pas t i. Malheureusement.j ee a a e comme dans d'autres langages de programmation. En e et.

j est quivalent .s avoir valu l'op rande gauche. cette valuation est inutile . Comme l' valuation de e e e e e e e l'op rande gauche ne r alise ici aucun e et de bord. donc e e e t i.

t j qui est l'adresse du sous-tableau correspondant .

e a a F.8 Erreur avec la compilation s par e e e Une erreur classique est d'avoir un tableau d ni dans une unit de compilation : e e int tab 10 . l'index j. et d'utiliser comme d claration de r f rence dans une autre unit de compilation : e ee e extern int * tab. Rappelons que int tab et int *t ne sont quivalents que dans le seul cas de param.

Dans le cas qui nous occupe ici.tre e e formel de fonction. la d claration de r f rence correcte e ee est : extern int tab . 209 .

210 .

et par Jargon C si il s'agit d'un particularisme du langage C.Glossaire Pour chaque mot de ce glossaire on indique par la notation G n ral si il s'agit d'un e e concept g n ral dans le domaine des langages de programmation. par Mat riel si il s'agit ee e d'un concept du domaine de l'architecture des machines. Derri.

Anglais : address. e adresse Mat riel . L'adresse d'un l ment est son rang dans la suite. ee e leur dans la case m moire correspondant .re cette indication. nous donnons le mot anglais utilis e e pour d signer ce concept. La m moire d'une machine est form e d'une suite e e e d' l ments m moires. Voir aussi : ee e ee l ment m moire.

Anglais : assignment. dans le langage C. elle est r alis e par un op rateur. Anglais : boolean. Op ration qui a pour but de stocker une vae e e bloc G n ral . e e e e e d clarations et des instructions. e vrai et faux. a ectation G n ral . type dont l'ensemble des valeurs est form des valeurs e e e e cha^ne de caract. Construction d'un langage qui permet de regrouper des e e bool en G n ral . Anglais : block. L'a ectation est g n ralee a ee ment r alis e par une instruction. une variable.

Anglais : string. Suite contigue en m moire de carac e e e e t.res G n ral .

Anglais : separate compilation. Technique qui consiste a e e ee . Un l ment d'un enregistrement. Un champ de structure C dont la taille est donn e en nombre de bits. e champ G n ral . Anglais : eld. Anglais : bit eld.res. e e ee champ de bits Jargon C . e compilation s par e G n ral .

compl ment .

2 Mat riel . Le compl ment . Anglais : 2's complement.

2 est une m e a e e a e d couper les gros programmes en di rentes unit s de compilation pour en ma^triser e e e la complexit . Les di rentes unit s sont compil es s par ment. Pour les nombres n gatifs. on part de la valeur absolue que l'on ree pr sente en binaire. on la compl mente bit . Les nombres positifs sont repr sent s e e e e en base 2. Sur 8 bits. e e thode de repr sentation des nombres sign s. la repr sentation de la valeur 6 est 00000110 et celle de 10 e est 00001010. et un diteur de liens e e e e e e e est charg de transformer les modules objets en programme ex cutable.

la e e a repr sentation de -6 est 11111010 et celle de -10 est 11110110 e 211 . Sur 8 bits. bit et on additionne 1.

une entit du langage. Il y a des d clarations de variable. Anglais : lifetime. e e e dur e de vie G n ral . L'identi cateur est un nom pour l'entit d clar e. Concept qui s'applique aux variables. de proc dure. de e e e fonction. de type. La dur e e e e e de vie d'une variable est le temps qui s' coule entre le moment o.

on alloue de la e u m moire pour cette variable. et le moment o.

on r cup.

dur e de vie du programme : la variable est cr e au chargement du programme e ee et d truite a la n du programme. Il e u e e e e existe classiquement trois types de dur e de vie : e .re la m moire allou e. Une telle variable est dite statique. e .

e l ment m moire Mat riel . modi cation de la valeur e d'une variable ou externe au programme par exemple criture dans un chier. statique. e et de bord G n ral . tas.dur e de vie d'un bloc : la variable est cr e quand on entre dans le bloc et e ee d truite quand on en sort. e Voir aussi : pile. Une machine comporte g n ralement au moins ee trois types d' l ments m moire : un l ment permettant de stocker un caract. e Toute partie de programme qui n'est pas d clarative a pour but soit de calculer une e valeur. Modi cation de l' tat de la machine. Anglais : side e ect.dur e de vie programm e : la variable est cr e et d truite par des ordres explie e ee e cites du programmeur. soit de faire un e et de bord. Une fraction de la m moire accessible ee e e e en une seule instruction machine. Un e et e e e de bord peut ^tre interne au programme par exemple. . Anglais : storage unit. Une telle variable est quali e de dynamique. dynamique. e e . Une telle variable est quali e de dynamique. fonction. Voir aussi : proc dure.

Au sein de l'enregise e trement. Type d ni par l'utilisateur permettant de e e e regrouper en une seule entit . Ce concept s'applique . Anglais : evaluation. Certains lane e e gages l'o rent Pascal. des variables de types di rents. C. et un l ment permettant de stocker un ee ee ottant. et ee e ee e un l ment permettant de stocker un entier. Anglais : set. Modula-2. e ensemble G n ral . Le concept math matique d'ensemble. enregistrement G n ral . les variables sont identi es par un nom. Anglais : record. d'autres pas Algol.re. valuation G n ral . Ada.

une expression. Anglais : function. Se dit d'une vae e e e luation qui n' value pas tous les op randes. dans le langage C. Voir aussi : valuation court-circuit. Poss. il n'y aura pas e e d' valuation de l'op rande droit. e e fonction G n ral . Evae e e a luer une expression c'est calculer sa valeur. Par exemple. e valuation court circuit G n ral . l'op e e e rateur && value d'abord son op rande gauche. Anglais : short circuit evaluation. si celui-ci est faux.

mais la caract ristique d'une fonction est de .de en commun avec la proc dure d'associer e e e e un nom a un traitement algorithmique.

e d livrer une valeur utilisable dans une expression. Construction qui associe un identi cateur et e e e . en plus du fait de retourner une valeur. de ee faire un ou plusieurs e ets de bord. Les langages de programmation e permettent g n ralement aux fonctions. Voir aussi : proc dure. Anglais : declaration. e 212 d claration G n ral .

on parle d'identi cateur pour dire nom. op ration consistant . initialisation G n ral . Anglais : initialization.langage de programmation.

donner une valeur e e e a initiale a une variable. Il y a deux types d'initialisation: les initialisations statiques .

.

e ee e par opposition aux identi cateurs qui sont librement choisis par le programmeur. Anglais : object. objet G n ral . la d claration de la variable et les initialisations dynamiques r alis es par des a e e e instructions. e e param. Anglais : keyword. membre Jargon C . Voir source. Un mot dont la signi cation est x e par le langage. mot-cl G n ral . Anglais : member Le mot utilis en C pour dire champ d'un enree gistrement.

La valeur qui est e e e pass e en param.tre e ectif G n ral . Anglais : e ective parameter ou argument.

tre a la fonction. e e .

param.

Le nom d'un pae e e ram. Anglais : formal parameter ou parameter.tre formel G n ral .

e e e passage de param.tre dans la d claration d'une proc dure ou fonction.

Technique de communie e e cation de param.tre G n ral . Anglais : parameter passing.

Il existe e e e diverses faons de passer les param.tre entre l'appelant et une proc dure ou fonction appel e.

tres dont les plus utilis es sont le passage par c e e valeur et le passage par adresse. Le langage C n'utilise que le passage par valeur. pile G n ral . les variables locales . Anglais : stack. Dans un langage r cursif.

une proe e e a c dure doivent ^tre allou es dans une pile. car .

e e pointeur G n ral . port e G n ral . Anglais : pointer. Ce concept s'applique aux identi cateurs. tas. Voir aussi : dur e de vie. et donc plusieurs instanciations e e des variables de la proc dure. un moment donn il peut y avoir e e e a e plusieurs activations en cours de la m^me proc dure. La port e e ee e d'un identi cateur est la partie du programme o. Type dont les valeurs possibles sont des adresses de e e variable. Anglais : scope.

Ce sont les blocs qui permettent ee . l'ensemble des occurences d'un u identi cateur font r f rence a la m^me d claration.

Permet d'associer un nom . e e de limiter la port e d'un identi cateur. Anglais : procedure. e proc dure G n ral .

e Le but d'une proc dure est de r aliser au moins un e et de bord sinon elle ne sert e e a . La proc dure est la brique de base de la construction de programme. un traitement ale e e a gorithmique.

r cursivit G n ral . Anglais : recursivity. Propri t d'une proc dure ou fonction a s'ape e ee ee e . rien.

Forme du programme crit en langage de programe e e mation. Cobol ne sont pas r cursifs. C sont r cursifs. Anglais : source. Les langages les plus anciens Fortran. e source G n ral . e e les langages modernes Pascal. peler elle-m^me. Par opposition .

la s mantique est conserv e. Entre la source et l'objet. Dans le domaine des e e . Anglais : identi er. seule e e la forme change. 213 identi cateur G n ral . objet qui est la forme du programme une fois traduit en a instructions machines. Synonyme de nom.

& e . Dans le langage C. le surchargement des op rateurs e e e est une v ritable plaie : * est a la fois op rateur d'indirection et de multiplication.s mantique d pend du contexte.

e est .

a e .. etc .. la fois op rateur adresse de " et and bit a bit".

Anglais : heap. tas G n ral . Zone de la m moire o.

Dans le langage e C. sont e ectu es les allocations dynae e e u e miques de variables explicitement demand es par le programmeur. les allocations et les lib rations dans le tas se font par des fonctions de la biblioe th.

que standard : calloc et malloc pour les allocations. type qui est connu du langage. par opposition e e aux types d nis par le programmeur. e e Voir aussi : dur e de vie. Attribut d'une variable qui d termine l'ensemble des valeurs e e e que peut prendre cette variable et les op rateurs qu'on peut lui appliquer. e e caract. e type G n ral . Anglais : basic type. pile. Anglais : type. free pour les lib rations. les types de base sont bool en. e type de base G n ral . Classiquement.

Anglais : user-de ned type. On n'a pas ine e e . ottant. e e type d ni par le programmeur G n ral . entier. Le langage C n'a pas le type bool en.re.

Regroupe les types suivants : . type entier Jargon C . Voir e e e e aussi : compilation s par e. double et long double. vent de nom pour ce concept : il est d sign par une p riphrase.les types num r s d nis par enum. Regroupe les float. Un des chiers source come e e posant un programme d velopp selon la technique de la compilation s par e. longs ou courts. Une abstraction du concept d' l ment m moire. pointeur vers type. Anglais : variable. A partir des types e e e e de base. ee e e . Anglais : integral type. Anglais : oating type.les char .. non sign s.. e e ee e variable globale G n ral . etc . Anglais : compilation unit. e e variable G n ral . Anglais : global variable. unit de compilation G n ral . le programeur peut construire de nouveaux types : tableau de type. e ee e type ottant Jargon C .toutes les vari t s de int : sign s. Variable d clar e .

Variable d clar e . Anglais : local variable. Les variables globales sont accessibles par toutes les e proc dures et fonctions. e variable locale G n ral . l'ext rieur de e e e e a e toute proc dure ou fonction.

Les variables locales sont inaccessibles . l'int rieur d'une e e e e a e proc dure ou fonction.

Un symbole est dit surcharg quand sa e e e 214 . surchargement G n ral . Anglais : structure. l'ext rieur de la e a e proc dure ou fonction dans laquelle elles sont d clar es. Anglais : overloading. e e e structure Jargon C . Synonyme d'enregistrement.

46. 135 STDC . 77 ascii. 117 elif. 140 ifndef.Index define. 135 a ectation. 139 ifdef. 77 argv. 105 allocation de m moire. 22 DATE . 109 e ansi. 135 FILE . 129 e auto. 135 LINE . 140 if. 81 argc. voir op rateur = e de structure. 10 associativit e op rateur. 150 biblioth. 5. 15. 148. 135 TIME . 139 else. 140 include. 139 error.

211 e break. 115. 109 caract. 56. 154. 20 bool en. 81. 5. 27. break calloc. 128 bloc.que standard. voir instruction. 29. e 109 big endian.

20 escape .re e . 163 cha^ne de caract. 36.. 49 return . 57 215 cast. 14. 12 case. conversion e cdecl. 12. 12 newline . 12 null . voir op rateur.

5 compilation conditionnelle. 139 e commentaire. 140 version. 139 compl ment a 2. 120 e . 134. 26. 6 mise en oeuvre du. 21. 7 common. 29. 27. 10 classe de m moire. 149 e commande du pr processeur. 14. 10. 76. 37. 151 compilateur. 78 e champs de bits. 36. 76. 15. 77. 69. 114 char.res. 79 e cha^ne litt rale. 14.

const. 155 constante. 14 caract. 69.

re. 11 e cha^ne de caract.

res. voir cha^ne lit e t rale e d cimale. 11 e enti.

119 cpp. 11 e nomm e. continue conversion. 28. 109 de types. 11 e ottante. 143 e d'union. 69 e de tableau. 122 e de cha^ne litt rale.re. voir instruction. 13 hexad cimale. 11 continue. 22. 65. 6 d claration. 20. 45 . 14 e octale. 17 arithm tiques habituelles. 153 de pointeur. 116. 26. 144 de fonction.

85 fputs. 29 exposant. 19. 82 getc. 15. 60 goto. 5 k&r. 56 espace de noms. 7. 86 chier d'inclusion. 20 entier. 29. 84 getchar. voir instruction. 87 goto. 115 num ration. 7. 40 do. 5. 10. 26. 95 else. goto identi cateur. if imbrication de blocs. 89. 122 dur e de vie. 83 fgetc. 144 e fopen. 89. 150. 22. 46 lib ration de m moire. 36. 148 e diteur de liens. 15. 82. 24 d nition. 59 e d'union. 105 de tableau. 144 de tableau. 143 e d' tiquette d' num ration. ottant fonction appel de. 152 fclose. 25 initialisation de structure. 151 e e et de bord. 103 if. 13 extern. 59 e d' tiquette de structure. 136 . voir instruction. 57 defined. 39. 115 do. 94 fseek. 16. for fprintf. 37. 146 de commentaires. 57 while. 103. 59 return. 85 gets. 19. de fonction r cursive. 56 e entr es-sorties. 88. 18. 39. entier entr e standard. 110 fscanf. 16. 96. 25.de structure. 14 de fonction. 40. 41. 38 int. 41 for. voir prototype. 19 iso. 103 e de constante. 22 d pendance de l'impl mentation. 26. 16 instruction break. 144 de structure. 122 ottant. 15. 144. 109 e e linux. voir instruction. voir instruction. 10. 57 compos e. 128. 17 e e exit. 89 fputc. 72 de variable. 20 e continue. 103. 150. 115 e e EOF. 22 port e de. 81 for. 59 if. 73 de variables simples. 26 prototype de . 38. voir type. 96. 22 FILE. 138 expression. e e 22. 146 tiquette. 7 de fonctions. 116. 27 e enum. 22 e 216 externe. 10. 84. 35. 22. 84 fgets. do double. 140 d nition. 116 e d' tiquette de branchement. 87 free. 144 valuation des op randes. 20 nulle. 115 e e e d' tiquette d'union. 145 e default. voir type. 88 float. 29 switch. 85. 25. 95 EOF. 25. 10.

41 macro. 115. 11. 128 long. 96. 122 lvalue. 133 avec param. 10. 89. 37. 16.little endian. 40.

135 e corps de.tres. 135 pr d nie. 135 expansion de. 133. 135 ee sans param.

109 mantisse. 46. 103 acc. 13 membre de structure. 28. 133 e main. 29 malloc.tre.

19 * adresse de. 81. 52. 7 e nombre entier. 86. 46. 10 ottant. 125 . 117 e mot-cl . 121 op rateur e !. 10 NULL. 82. 107. 56 et bit a bit. 43 !=.s aux.

37. 128 sur les structures. voir op rateur * e modulo. voir op rateur ++ e e indexation. 124 |. 66 indirection. 105. voir op rateur  e ou logique. 131 e param. voir op rateur && e incr mentation. 127 e conversion. 125 ~tilde. 129 de comparaison. voir op rateur & e a ectation. voir op rateur = e a ectation compos e. 123. 107 ordre d' valuation. 42 ^. 42 adresse de . voir op rateur || e sizeof. 127 d'adressage. 125 ||. voir op rateur -e e e et logique. 109. &&. 19 d cr mentation.

77 e ectif. voir structure. 156 passage de. 24 formel. 52 passage de structure en. 52 par valeur. 52 par adresse.tre e de programme. passage en param. 22 nombre variable de.

passage en param.tre e passage de tableau en. voir tableau.

45. 19 . 49 e et tableau. 49 e et op rateurs + et -. 16. 19 . 49 e concept de. 126 -. 128 ee invalide. 19 =. 18 +. 65 g n rique. voir NULL 217 indirection. 41 . 17 ++. 125 =. 17 --. 125 ?:. 126 .. 46 multiplication.tre e pointeur arithm tique sur. 120 conversion vers. 19 . 121 et op rateurs ++ et --. 19 ==. 40 . 18 & . 18 . 19 =.point. 107 . 105 .virgule. 45 conversion d'un.

86 puts. 22 ptrdiff t. 86 putchar. 155 r cursivit e e de fonction. 50 putc. voir instruction. 92 priorit e op rateur. 27. voir structure. return scanf. 6. r cursive e register. voir instruction. voir fonction. 117 e printf. 15. surcharge d'op rateur. 119 e de *.vers une structure. 28 promotion des entiers. 129 e proc dure. 88 quali catif de type. 59 switch. switch tableau de caract. 149. 81. 121 prototype de fonction. 46 de break. 150 return. 107 pr processeur. r cursive e de structure. voir fonction e programme. 70.

37. 75 de structure. 65 g n ralit . 105 d claration. 35 e l ment de. 72 passage en param.res. 37 e de pointeurs. 65 ee e initialisation. voir initialisation de tableau multidimensionnel. 36. 72 ee et pointeur.

67. 72 e taille de. 35 trigraphe.tre. 68. 11 type. 153 caract.

150 stderr. 153 union. 93 sscanf. 122. 156 end. 148. 99 static. 150. 156 list. 125 va va va va arg. de structure d claration. 96 shell. 144 unit de compilation. 28. 96. 56. 10. 114. 83 struct. 10. 134 short. 10 e entier. 156 56. sur e e les structures passage en param. 96. 144 structure. voir op rateurs. e e 89. voir d claration. 103. 156 start. voir operateur. 96. 116. voir initialisation. de structure op rateurs sur. 123. 7. sizeof sprintf. 29. 27. 120 ottant. de struce e ture initialisation. 14. 89. 10. 155 typedef. 6 e unsigned. 99 s quence d' chappement. 131.re. 10. 11. 120 quali catif de. 115 sizeof . 83 stdin. 96. 144 a ectation. 83 stdout. 11. 122 signed. 89. 151 e unit lexicale. voir a ectation. 79.

89. 108 e r cursive. 128 volatile. 28 locale. 5 visibilit . 22. voir instruction. 121. 22 25.tre. 155 while. 28. 107 e 218 variable globale. 45. 53 version. while . 146 e void.

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.