1. INTRODUCTION AU LANGAGE C char rahc [ ] = "n/" , redivider [ ] = "Able was I ere I saw elbA" , C * 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)) ; /* {*/}Bernard Cassagne http://krimo666.mylivepage.com/
2. Bernard CassagneIntroduction au langage C norme iso ansi Laboratoire clips Universit Joseph Fourier & cnrs e Grenoble http://krimo666.mylivepage.com/
3. Copyright 1997-1998 Bernard CassagneCe texte est copyright et nest pas dans le domaine public. Sa reproduction est cependant eautorise a condition de respecter les conditions suivantes : e
4. Si ce document est reproduit pour les besoins personnels du reproducteur, toute forme de reproduction totale ou partielle est autorise. e Si ce document est reproduit dans le but detre distribu
5. de tierces personnes : ea il devra etre reproduit dans son intgralit sans aucune modi cation. Cette e e notice de copyright devra donc etre prsente. e il ne devra pas etre vendu. Cependant, dans le seul cas dun enseignement gratuit, une participation aux frais de reproduction pourra etre demande, mais e elle ne pourra etre suprieure au prix du papier et de lencre composant le e document.Toute reproduction sortant du cadre prcis ci-dessus est interdite sans accord pralable e e ede lauteur. Un chier PostScript contenant ce document est librement accessible par lurl :ftp: ftp.imag.fr pub DOC.UNIX C Introduction ANSI C.psVersion de ce document : 2.1 de juin 1998 http://krimo666.mylivepage.com/
68. Avant-proposAu sujet de lauteur Je suis ingnieur au cnrs et je travaille dans un laboratoire de recherche de luniver- esit de Grenoble : le laboratoire clips http: www-clips.imag.fr. Toute noti cation ederreur ou toute proposition damlioration de ce document sera la bienvenue
69. le-mail e aBernard.Cassagne@imag.fr.Au sujet de ce manuel La littrature technique nous a habitu
70. deux styles dcriture de manuels : le style e ea e manuel de rfrence et le style guide de lutilisateur Les manuels de rfrence se ee eedonnent comme buts detre exhaustifs et rigoureux. Les guides de lutilisateur se donnentcomme but detre didactiques. Cette partition vient du fait quil est quasiment impossiblesur des sujets complexes comme les langages de programmation detre
71. la fois rigoureux aet didactique. Pour sen persuader il su t de lire le texte dune norme internationale. Ce manuel se place dans la catgorie guide de lutilisateur : son but est de permettre ea
72. une personne sachant programmer, dacqurir les lments fondamentaux du langage C. e eeCe manuel prsente donc chaque notion selon une gradation des di cults et ne cherche e epas
73. etre exhaustif. Il comporte de nombreux exemples, ainsi que des exercices dont la asolution se trouve dans le corps du texte, mais commence toujours sur une page di rente. eLe lecteur peut donc au choix, ne lire les solutions quapr
74. s avoir programm sa solution e epersonnelle, ou bien lire directement la solution comme si elle faisait partie du manuel.Les notions supposes connues du lecteur e Les notions supposes connues du lecteur sont les concepts gnraux concernant les lan- e eegages de programmation. En n du texte se trouve un glossaire qui regroupe des conceptsgnraux et certains concepts propres du langage C. En cas de rencontre dun mot inconnu, eele lecteur est invit
76. mes de traduction e Le document de rfrence concernant le langage C est la norme ansi d nissant le ee elangage. Cest un document crit en anglais technique, ce qui pose des probl
77. mes de e etraduction : comment traduire les nologismes invents pour les besoins du langage? De e emani
79. ne pas drouter les lecteurs franais, je me suis impos de respecter les choix de e a e c e 1 http://krimo666.mylivepage.com/
80. traduction dun grand diteur 1 de livres techniques, meme quand je nai pas trouv ces e echoix tr
81. s heureux. Jai donc utilis dclarateur, initialisateur et spci cateur bien que me e e e esemble-t-il, ils r^pent assez fort le palais quand on les prononce. aConventions syntaxiques Les r
82. gles de grammaires qui sont donnes dans le corps de ce manuel sont simpli es e e edans un but didactique par rapport
83. la grammaire o cielle du langage. Cependant, le alecteur trouvera
84. lannexe D la grammaire sous une forme exhaustive et conforme
86. gles suit les conventions suivantes : e 1. les lments terminaux du langage seront crits dans une fonte
87. largeur constante, ee e a comme ceci : while. 2. les lments non terminaux du langage seront crits en italique, comme ceci : ee e instruction. 3. les r
91. gauche et e e a suivies du signe deux points :. les di rentes parties droites possibles seront introduites par le signe et e indentes sur la droite. e Exemple : instruction : if expression instruction 1 if expression instruction 1 else instruction 2 Ceci signi e quil y a deux mani
92. res possibles de driver le non-terminal ins- e e truction. La premi
96. gle indique quon peut aussi le driver en : e e e if expression instruction 1 else instruction 2 une partie droite de r
97. gle pourra etre crite sur plusieurs lignes. Ceci permettra e e de r ter une mani
98. re possible de mettre en page le fragment de programme ee e C correspondant, de faon
99. obtenir une bonne lisibilit. c a e Sans en changer la signi cation, lexemple prcdent aurait pu etre crit : ee e instruction : if expression instruction 1 if expression instruction 1 else instruction 2 1. Cest masson qui a dit en franais 1 et 2 Cf. Bibliographie e e c 2 http://krimo666.mylivepage.com/
103. gle : e dclarateur-init : e dclarateur initialisateur option e indique que dclarateur-init peut se driver soit en : e e dclarateur initialisateur e soit en : dclarateur eRemerciements Beaucoup de personnes mont aid
104. amliorer le manuscrit original en me signalant ea ede nombreuses erreurs et en me proposant des amliorations. Quelles soient toutes remer- ecies de leurs lectures attentives et amicalement critiques, tout particuli
105. rement Damien e eGenthial, Fabienne Lagnier, Xavier Nicollin et Serge Rouveyrol. 3 http://krimo666.mylivepage.com/
106. Chapitre 1Les bases Le but de ce chapitre est de prsenter les lments de base du langage C, sous leur forme e eela plus simple. Arriv au bout du chapitre, le lecteur sera capable dcrire des programmes e elmentaires.ee1.1 Les versions du langage C Le langage C a subi au cours de son histoire deux grandes tapes de d nition. Il a e et d ni une premi
107. re fois par deux chercheurs des Laboratoires Bell, B. Kernighan et D.ee e eRitchie, dans un livre intitul The C Programming Language , publi en 1978. Cette e eversion est appele Kernighan et Ritchie 78 , ou KR 78 en abrg, ou encore le plus e eesouvent, simplement KR. Suite
113. res. A la n des aannes 80, il devint ncessaire de mettre de lordre dans ce chaos et donc de normaliser e ele langage, t^che
114. laquelle sattela lansi 1, organisme de normalisation amricain. La a a enorme ansi fut termine en 1989. En 1990, liso 2 , organisme de normalisation interna- etional, donc chapeautant lansi, adopta tel quel le standard ansi en tant que standardiso. Cette seconde version du langage C devrait donc sappeler iso c, mais comme lesacteurs importants du monde informatique sont de culture anglo-saxonne et que ceux-cipersistent
115. lappeler ansi c, presque? tout le monde fait de meme. Dans ce manuel, anous suivrons lusage gnral, et utiliserons lexpression ansi c pour dsigner la norme ee ecommune
116. lansi et liso. a Ce document dcrit C ansi, avec parfois des rfrences
122. me unix. ee c e e ePour cette raison, ses concepteurs ont fait une sparation nette entre ce qui est purement e 1. American National Standards Institute 2. International Standards Organization 5 http://krimo666.mylivepage.com/
126. que standard. Cette coupure se retrouve e edans la norme qui est compose essentiellement de deux grands chapitres, les chapitres e langage et biblioth
127. que . e Ce manuel se donne comme objectif de donner une vue densemble du langage, mais pasde la biblioth
131. te que les fonctions permettant de raliser les entres-sorties et la gestion mmoire. e e e eCependant, la liste exhaustive des noms des fonctions de la biblioth
132. que, classs par type e edutilisation, est donne dans le chapitre 10. e1.3 Les phases de compilationLes compilateurs C font subir deux transformations aux programmes : 1. un prprocesseur ralise des transformations dordre purement textuel, pour rendre e e des services du type inclusion de source, compilation conditionnelle, et traitement de macros ; 2. le compilateur proprement dit prend le texte gnr par le prprocesseur et le traduit e ee e en instructions machine. La fonction de prprocesseur est assez souvent implmente par un programme spar e e e e ecpp sous unix qui est automatiquement appel par le compilateur. e1.4 Les jeux de caract
133. res e Le lecteur non familiaris avec les probl
143. res et les commentaires est dpendant e e ede limplmentation. e Pendant tr
144. s longtemps les programmeurs non anglophones ont utilis lascii faute de e emieux, pour programmer en C. Actuellement, si on est dans le monde unix, il ne doitpas y avoir de probl
145. me pour disposer dun environnement de travail la fenetre, le shell, elditeur, le compilateur enti
147. la norme iso-8859. Dans ce manuel, on suppose e e aque le lecteur dispose dun tel environnement : les exemples donns sont crits en iso-8859. e e1.5 Les units lexicales e Le langage comprends 6 types dunits lexicales : les mots-cls, les identi cateurs, les e econstantes, les chanes, les oprateurs et les signes de ponctuation. e 6 http://krimo666.mylivepage.com/
149. mots-cls, ce qui signi e quun certain nombre de a emots sont rservs pour le langage lui-meme et ne peuvent donc pas etre utiliss comme e e eidenti cateurs. La liste exhaustive des mots-cls est la suivante : e auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static whileAttention Si le compilateur produit un message derreur syntaxique incomprhensible il est re- ecommand davoir le r exe de consulter la liste des mots cls pour vri er que lon a pas e e e epris comme identi cateur un mot-cl. Si le lecteur dsire etre convaincu, il lui est suggr e e eede donner le nom long
151. re. a e1.5.2 Les identi cateurs Le but dun identi cateur est de donner un nom
152. une entit du programme variable, a eprocdure, etc. Les identi cateurs sont forms dune suite de lettres, de chi res et du signe e esoulign, suite dont le premier caract
153. re ne peut pas etre un chi re. Les lettres formant e eles identi cateurs peuvent etre majuscules ou minuscules, mais doivent faire partie delalphabet anglais : les lettres accentues sont interdites. Les noms var1, PremierIndex, ei_tab, _deb sont des identi cateurs valides, mais 1i et i:j ne le sont pas. Un compilateur a le droit de tronquer les identi cateurs internes ceux qui ne sont pasexports
163. res. De surcrot, la distinction entre minus- ee e a ecules et majuscules nest pas garantie au contraire des noms internes, pour lesquels cettedistinction est garantie.1.6 Les commentaires Syntaxe : Les commentaires dbutent par e * et se terminent par * . Exemple : * Ceci est un commentaire * Toute occurrence de * est interprte comme le dbut dun commentaire sauf dans ee e une chane littrale, ou un commentaire les commentaires ne peuvent donc pas etre e imbriqus. e 7 http://krimo666.mylivepage.com/
164. Recommandations : Dans le domaine gnral de la programmation, pas seulement le langage C, il est ee admis quil faille commenter selon les niveaux suivants : unit de compilation : pour indiquer le nom de lauteur, les droits de copyright, e la date de cration, les dates et auteurs des di rentes modi cations, ainsi que e e la raison detre de lunit ; e procdure : pour indiquer les param
165. tres et la raison detre de la procdure ; e e e groupe dintructions : pour exprimer ce que ralise une fraction signi cative e dune procdure ; e dclaration ou instruction : le plus bas niveau de commentaire. e Pour le niveau unit de compilation, voici un exemple tir du source de perl : e e * * Copyright c 1991, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * * $Log: perl.c,v $ * Revision 4.0.1.8 1993 02 05 19:39:30 lwall * Revision 4.0.1.7 92 06 08 14:50:39 lwall * Revision 4.0.1.3 91 06 07 11:40:18 lwall * Revision 4.0.1.2 91 06 07 11:26:16 lwall * Revision 4.0.1.1 91 04 11 17:49:05 lwall * Revision 4.0 91 03 20 01:37:44 lwall * 4.0 baseline. * * Pour le niveau de la procdure, je trouve agrable de raliser des esp
166. ces de car- e e e e touches permettant de dcouper visuellement un listing en ses di rentes procdures, 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 dinstruction, il est classique de faire une mise en page comme dans lexemple suivant tir du source de dvips 3 : e *3. dvips est un traducteur en PostScript du format gnr par TeX e ee 8 http://krimo666.mylivepage.com/
167. * If nothing above worked, then we get desperate. We attempt to * open the stupid font at one of a small set of predefined sizes, * and then use PostScript scaling to generate the correct size. * * We much prefer scaling up to scaling down, since scaling down * can omit character features, so we try the larger sizes first, * and then work down. * Pour le niveau dclaration ou instruction, on commentera sur la meme ligne. Exemple e tir du source du compilateur gnu cc : e char *name; * Function unit name. * struct function_unit *next; * Next function unit. * int multiplicity; * Number of units of this type. * int simultaneity; * Maximum number of simultaneous insns on this function unit or 0 if unlimited. * struct range ready_cost; * Range of ready cost values. * struct range issue_delay; * Range of issue delay values. *Attention Lerreur classique avec les commentaires est doublier la squence fermante * . Dans e ce cas, le compilateur va considrer que le commentaire se poursuit jusqu
168. la n du e a prochain commentaire et ceci peut ne pas gnrer derreur syntaxique. ee Exemple : instruction * premier commentaire instruction ... instruction * second commentaire * instruction On voit que dans ce cas, tout un ensemble dinstructions sera ignor par le compila- e teur sans gnrer le moindre message derreur ee 4. Un commentaire ne peut pas contenir un commentaire, il nest donc pas possible de mettre en commentaire un morceau de programme comportant dj
169. des commen- ea taires 5. 4. Dans 5 , Peter Van der Linden donne un exemple amusant de ce bug. Dans un compilateur, le cacit ede lalgorithme de hachage de la table des identi cateurs dpendait de la bonne initialisation dune variable. eDans le code initial, linitialisation avait t mise involontairement dans un commentaire provoquant une eeinitialisation par dfaut
170. zro. La simple correction du bug, t gagner 15 de cacit au compilateur ! e a e e 5. Voir cependant F.4 9 http://krimo666.mylivepage.com/
176. res nest pas d ni par le langage : cest un choix dimplmentation. e e eCependant, dans la grande majorit des cas, le code utilis est le code dit ascii, ou un e esurensemble comme par exemple la norme iso-8859.Attention Le type caract
178. ce qui se fait habituellement dans les e alangages de programmation. La norme prcise clairement quun objet de type caract
179. re e epeut etre utilis dans toute expression o
180. un objet de type entier peut etre utilis. Par e u eexemple, si c est de type char, il est valide dcrire c + 1 : cela donnera le caract
181. re e esuivant dans le code utilis sur la machine. e1.7.2 Les entiers Le mot cl dsignant les entiers est int. Les entiers peuvent etre a ects de deux types e e edattributs : un attribut de prcision et un attribut de reprsentation. e e Les attributs de prcision sont short et long. Du point de vue de la prcision, on peut e eavoir trois types dentiers : short int, int et long int. Les int sont implments sur ce e equi est un mot naturel de la machine. Les long int sont implments si possible plus e egrands que les int, sinon comme des int. Les short int sont implments si possible e eplus courts que les int, sinon comme des int. Les implmentations classiques mettent les eshort int sur 16 bits, les long int sur 32 bits, et les int sur 16 ou 32 bits selon ce quiest le plus e cace. Lattribut de reprsentation est unsigned. Du point de vue de la reprsentation, on e epeut avoir deux types dentiers : int et unsigned int. Les int permettent de contenirdes entiers signs, tr
183. 2, bien que cela e e ee e e ane soit pas impos par le langage. Les unsigned int permettent de contenir des entiers enon signs en reprsentation binaire. e e On peut combiner attribut de prcision et attribut de reprsentation et avoir par e eexemple un unsigned long int. En rsum, on dispose donc de six types dentiers : e eint, short int, long int tous trois signs et unsigned int, unsigned short int eet unsigned long int.1.7.3 Les ottants Il existe trois types de ottants correspondants
184. trois prcisions possibles. En allant a ede la prcision la plus faible vers la plus forte, on dispose des types float, double et elong double. La prcision e ectivement utilise pour chacun de ces types dpend de e e elimplmentation. e 10 http://krimo666.mylivepage.com/
186. res e Syntaxe : On dispose de 3 notations pour les constantes enti
187. res : dcimale, octale et hexad- e e e cimale. Les constantes dcimales scrivent de la mani
188. re usuelle ex : 372. Les constantes e e e octales doivent commencer par un zro et ne comporter que des chi res octaux e ex : 0477. Les constantes hexadcimales doivent commencer par 0x ou 0X et etre e composes des chi res de 0
190. f sous leur forme majuscule e a a ou minuscule ex : 0x5a2b, 0X5a2b, 0x5A2B. Une constante enti
191. re peut etre su xe par la lettre u ou U pour indiquer quelle e e doit etre interprte comme tant non signe. Elle peut galement etre su xe par ee e e e e la lettre l ou L pour lui donner lattribut de prcision long. e Smantique : e Le type dune constante enti
192. re est le premier type, choisi dans une liste de types, e permettant de reprsenter la constante : e forme de la constante liste de types pas de su xe, dcimal e int, long int, unsigned long int pas de su xe, octal ou hexadcimal int, unsigned int, long int, unsigned e long int su x par u ou U e unsigned int, unsigned long int su x par l ou L e long int, unsigned long int su x par u ou U et l ou L e unsigned long intAttention Ces conventions dcriture des constantes ne respectent pas lcriture mathmatique, e e epuisque 010 devant etre interprt en octal, nest pas gal