Sommaire: Cours Introduction au langage C Bernard Cassagne
1 Les bases
1.1 Les versions du langage C
1.2 Langage et bibliotheque standard
1.3 Les phases de compilation
1.4 Les jeux de caracteres
1.5 Les unites lexicales
1.5.1 Les mots-cles
1.5.2 Les identicateurs
1.6 Les commentaires
1.7 Les types de base
1.7.1 Les caracteres
1.7.2 Les entiers
1.7.3 Les ottants
1.8 Les constantes
1.8.1 Les constantes entieres
1.8.2 Les constantes caracteres
1.8.3 Les constantes ottantes
1.9 Les cha^nes de caracteres litterales
1.10 Les constantes nommees
1.10.1 Les #dene
1.10.2 Les enumerations
1.11 Declarations de variables ayantuntype de base
1.12 Les operateurs les plus usuels
1.12.1 L’aectation
1.12.2 L’addition
1.12.3 La soustraction
1.12.4 La multiplication
1.12.5 La division
1.12.6 L’operateur modulo
1.12.7 Les operateurs de comparaison
1.13 Les instructions les plus usuelles
1.13.1 Instruction expression
1.13.2 Instruction composee
1.13.3 Instruction if
1.14 Inclusion de source
1.15.1 Denition d’une fonction
1.15.2 Appel d’une fonction
1.15.3 Les procedures
1.15.4 Fonctions imbriquees
1.15.5 Recursivite
1.15.6 Reference a une fonction externe
1.15.7 Comprendre la documentation de la bibliotheque standard
1.15.8 Les fonctions dans le style K&R
1.16 Impression formattee
1.17 Structure d’un programme
1.18 Terminaison d’un programme
1.19 Mise en oeuvre du compilateur C sous UNIX
1.20 Exercice
1.21 Recreation
2 Les tableaux
2.1 Les tableaux
2.1.1 Declaration de tableaux dont les elements ontuntype de base
2.1.2 Initialisation d’un tableau
2.1.3 Reference aunelement d’un tableau
2.1.4 Cha^nes et tableaux de caracteres
2.2 Les instructions iteratives
2.2.1 Instruction for
2.2.2 Instruction while
2.2.3 Instruction do
2.2.4 Instruction break
2.2.5 Instruction continue
2.3 Les operateurs
2.3.1 Operateur pre et postincrement
2.3.2 Operateur pre et postdecrement
2.3.3 Quelques utilisations typiques de ces operateurs
2.3.4 Operateur et logique
2.3.5 Operateur ou logique
2.3.6 Operateur non logique
2.4 Exercice
3 Les pointeurs
3.1 Notion de pointeur
3.2 Declarations de variables de type pointeur vers les types de base
3.3 Type de pointeur generique
3.4 Operateur adresse de
3.5 Operateur d’indirection
3.6 Exercice
3.7 Pointeurs et operateurs additifs
3.7.1 Operateurs + et –
3.7.2 Operateurs ++ et —
3.8 Dierence de deux pointeurs
3.9 Exercice
3.10 Passage de parametres
3.10.1 Les besoins du programmeur
3.10.2 Comment les langages de programmation satisfont ces besoins
3.10.3 La strategie du langage C
3.11 Discussion
3.12 Une derniere precision
3.13 Exercice
3.14 Lecture formattee
3.15 Les dernieres instructions
3.15.1 Instruction switch
3.15.2 Instruction goto
3.15.3 Instruction nulle
3.16 Exercice
3.17 Recreation
4 Relations entre tableaux et pointeurs
4.1 Conversion des tableaux
4.2 L’operateur d’indexation
4.3 Passage de tableau en parametre
4.4 Modication des elements d’un tableau passe en parametre
4.5 Interdiction de modication des elements d’un tableau passe en parametre 9
4.6 Conversion des cha^nes litterales
4.7 Retour sur printf
4.8 Exercice
4.9 Tableaux multidimensionnels
4.9.1 Declarations
4.9.2 Acces aux elements
4.9.3 Passage en parametre
4.10 Initialisation
4.11 Exercice
4.12 Tableau de pointeurs
4.12.1 Cas general
4.12.2 Tableaux de pointeurs vers des cha^nes
4.12.3 Parametres d’un programme
4.13 Tableau et pointeur, c’est la m^eme chose?
4.13.1 Commentaires
4.13.2 Cas particulier des cha^nes litterales
4.14 Recreation
5 Les entrees-sorties
5.1 Pointeur invalide
5.2 Ouverture et fermeture de chiers
5.2.1 Ouverture d’un chier : fopen
5.2.2 fermeture d’un chier : fclose
5.3 Lecture et ecriture par caractere sur chier
5.3.1 lecture par caractere : fgetc
5.3.2 lecture par caractere : getc
5.3.3 lecture par caractere : getchar
5.3.4 ecriture par caractere : fputc
5.3.5 ecriture par caractere : putc
5.3.6 ecriture par caractere : putchar
5.4 Lecture et ecriture par lignes sur chier
5.4.1 lecture par ligne : fgets
5.4.2 lecture par ligne : gets
5.4.3 ecriture par cha^ne : fputs
5.4.4 ecriture par cha^ne : puts
5.5 E/S formattees sur chiers
5.5.1 Ecriture formattee : fprintf
5.5.2 Ecriture formattee : printf
5.5.3 Ecriture formattee dans une chane : sprintf
5.5.4 Exemples d’utilisation des formats
5.5.5 Entrees formattees : fscanf
5.5.6 Entrees formattees : scanf
5.5.7 Entrees formattees depuis une cha^ne : sscanf
5.6 Recreation
5.7 Exercice 1
5.8 Exercice 2
6 Structures, unions et enumerations
6.1 Notion de structure
6.2 Declaration de structure
6.3 Operateurs sur les structures
6.3.1 Acces aux membres des structures
6.3.2 Aectation de structures
6.3.3 Comparaison de structures
6.4 Tableaux de structures
6.5 Exercice
6.6 Pointeurs vers une structure
6.7 Structures dont un des membres pointe vers une structure du meme type 0
6.8 Acces aux elements d’une structure pointee
6.9 Passage de structures en parametre
6.10 Determination de la taille allouee auntype
6.10.1 Retour sur la conversion des tableaux
6.11 Allocation et liberation d’espace pour les structures
6.11.1 Allocation d’espace : fonctions malloc et calloc
6.11.2 Liberation d’espace : procedure free
6.12 Exercice
6.13 Les champs de bits
6.13.1 Generalites
6.13.2 Contraintes
6.14 Les enumerations
6.15 Les unions
6.16 Acces aux membres de l’union
6.17 Utilisation pratique des unions
6.18 Une methode pour alleger l’acces aux membres
7 Les expressions
7.1 Les conversions de types
7.1.1 Utilite des conversions
7.1.2 Ce qu’il y a dans une conversion
7.1.3 L’ensemble des conversions possibles
7.1.4 Les situations de conversions
7.1.5 La promotion des entiers
7.1.6 Les conversions arithmetiques habituelles
7.1.7 Les surprises des conversions
7.2 Les operateurs
7.2.1 Operateur non bit a bit
7.2.2 Operateur et bit a bit
7.2.3 Operateur ou bit a bit
7.2.4 Operateur ou exclusif bit a bit
7.2.5 Operateur decalage a gauche
7.2.6 Operateur decalage a droite
7.2.7 Operateur conditionnel
7.2.8 Operateur virgule
7.2.9 Operateurs d’aectation composee
7.3 Operateur conversion
7.4 Semantique des expressions
7.4.1 Operateurs d’adressage
7.4.2 Priorite et associativite des operateurs
7.4.3 Ordre d’evaluation des operandes
7.5 Recreation
8 Le preprocesseur
8.1 Traitement de macros
8.1.1 Les macros sans parametres
8.1.2 Macros predenies
8.1.3 Les macros avec parametres
8.1.4 Les pieges des macros
8.1.5 Macros generant des instructions
8.2 Compilation conditionnelle
8.2.1 Commande #if
8.2.2 Commandes #ifdef et #ifndef
8.2.3 L’operateur defined
8.2.4 La commande #error
8.2.5 Usage
9 Les declarations
9.1 Declarations de denition et de reference
9.1.1 Declarations de variables
9.1.2 Declarations de fonctions
9.1.3 Declarations d’etiquettes de structures et union
9.2 Portee des declarations
9.3 Visibilite des identicateurs
9.4 Les espaces de noms
9.4.1 Position du probleme
9.4.2 Les espaces de noms du langage C
9.5 Duree de vie
9.6 Classes de memoire
9.6.1 Position du probleme
9.6.2 Les specicateurs de classe de memoire
9.7 La compilation separee
9.7.1 Generalites
9.7.2 La methode du langage C
9.8 Denition de types
9.9 Utilite des typedef
9.9.1 Restriction d’un type de base
9.9.2 Denition de type structure
9.9.3 Denition de types opaques
9.10 Qualicatifs de type
9.11 Fonction a nombre variable de parametres
9.11.1 Exemple 1
9.11.2 Exemple 2
9.12 Syntaxe des declarations
9.13 Semantique des declarations
9.14 Discussion sur les declarations
9.15 En pratique
9.16 Un outil : cdecl
10 La bibliotheque standard
10.1 Diagnostic
10.2 Manipulation de caracteres <ctype.h>
10.3 Environnement local <locale.h>
10.4 Mathematiques <math.h>
10.4.1 Fonctions trigonometriques et hyperboliques
10.4.2 Fonctions exponentielles et logarithmiques
10.4.3 Fonctions diverses
10.5 Branchements non locaux <setjmp.h>
10.6 Manipulation des signaux <signal.h>
10.7 Nombre variable de parametres <stdarg.h>
10.8 Entrees sorties <stdio.h>
10.8.1 Operations sur les chiers
10.8.2 Acces aux chiers
10.8.4 Entrees-sorties caracteres
10.8.5 Entrees-sorties binaires
10.8.6 Position dans un chier
10.8.7 Gestion des erreurs
10.9 Utilitaires divers <stdlib.h>
10.9.1 Conversion de nombres
10.9.2 Generation de nombres pseudo-aleatoires
10.9.3 gestion de la memoire
10.9.4 Communication avec l’environnement
10.9.5 Recherche et tri
10.9.6 Arithmetique sur les entiers
10.9.7 Gestion des caracteres multi-octets
10.10Manipulation de cha^nes <string.h>
10.11Manipulation de la date et de l’heure <time.h>
A Les jeux de caracteres
A.1 Les normes
A.2 Le code ascii
A.2.1 Les codes ascii en octal
A.2.2 Les codes ascii en hexadecimal
A.2.3 Les codes ascii en decimal
A.3 Les codes ISO-Latin-1
B Bibliographie
C Ressources Internet
D La grammaire
D.1 Les unites lexicales
D.2 Les mots-cles
D.3 Les identicateurs
D.4 Les constantes
D.5 Les cha^nes litterales
D.6 Les operateurs
D.7 La ponctuation
D.8 Nom de chier d’inclusion
D.9 Les nombres du preprocesseur
D.10 Les expressions
D.11 Les declarations
D.12 Les instructions
D.13 Denitions externes
D.14 Directives du preprocesseur
D.15 References croisees de la grammaire
E Un bestiaire de types
E.1 Les types de base
E.2 Les tableaux
E.3 Les pointeurs
E.4 Les fonctions
E.5 Les enumerations
E.6 Les structures, unions et champs de bits
E.7 Les qualicatifs
F Le betisier
F.1 Erreur avec les operateurs
F.1.1 Erreur sur une comparaison
F.1.2 Erreur sur l’aectation
F.2 Erreurs avec les macros
F.2.1 Un #define n’est pas une declaration
F.2.2 Un #define n’est pas une initialisation
F.2.3 Erreur sur macro avec parametres
F.2.4 Erreur avec les eets de bord
F.3 Erreurs avec l’instruction if
F.4 Erreurs avec les commentaires
F.5 Erreurs avec les priorites des operateurs
F.6 Erreur avec l’instruction switch
F.6.1 Oubli du break
F.6.2 Erreur sur le default
F.7 Erreur sur les tableaux multidimensionnels
F.8 Erreur avec la compilation separee
Extrait du cours introduction au langage C Bernard Cassagne
Avant-propos
Au sujet de l’auteur
Je suis ingenieur au cnrs et je travaille dans un laboratoire de recherche de l’universite de Grenoble : le laboratoire clips (http://www -clips.imag.fr). Toute notication d’erreur ou toute proposition d’amelioration de ce document sera la bienvenue a l’e-mail Bernard.Cassagne@imag.fr.
Au sujet de ce manuel
La litterature technique nous a habitue a deux styles d’ecriture de manuels : le style (( manuel de reference )) et le style (( guide de l’utilisateur )) Les manuels de reference se donnent comme buts d’etre exhaustifs et rigoureux. Les guides de l’utilisateur se donnent comme but d’etre didactiques. Cette partition vient du fait qu’il est quasiment impossible sur des sujets complexes comme les langages de programmation d’etre a la fois rigoureux et didactique. Pour s’en persuader il sut de lire le texte d’une norme internationale.
Ce manuel se place dans la categorie (( guide de l’utilisateur )) : son but est de permettre a une personne sachant programmer, d’acquerir les elements fondamentaux du langage C.
Ce manuel presente donc chaque notion selon une gradation des dicultes et ne cherche pas aetre exhaustif. Il comporte de nombreux exemples, ainsi que des exercices dont la solution se trouve dans le corps du texte, mais commence toujours sur une page dierente.
Le lecteur peut donc au choix, ne lire les solutions qu’apres avoir programme sa solution personnelle, ou bien lire directement la solution comme si elle faisait partie du manuel.
Les notions supposees connues du lecteur
Les notions supposees connues du lecteur sont les concepts generaux concernant les langages de programmation. En n du texte se trouve un glossaire qui regroupe des concepts generaux et certains concepts propres du langage C. En cas de rencontre d’un mot inconnu, le lecteur est invitea s’y reporter.
Un mot sur les problemes de traduction
Le document de reference concernant le langage C est la norme ansi denissant le langage. C’est un document ecrit en anglais technique, ce qui pose des problemes de traduction : comment traduire les neologismes inventes pour les besoins du langage? De maniere a ne pas derouter les lecteurs francais, je me suis impose de respecter les choix detraduction d’un grand editeur de livres techniques, meme quand je n’ai pas trouve ces choix tres heureux. J’ai donc utilise declarateur, initialisateur et specicateur bien que me semble-t-il, ils rapent assez fort le palais quand on les prononce.
Conventions syntaxiques
Les regles de grammaires qui sont donnees dans le corps de ce manuel sont simpliees (dans un but didactique) par rapport a la grammaire ocielle du langage. Cependant, le lecteur trouvera a l’annexe D la grammaire sous une forme exhaustive et conforme a la norme ansi.Latypographie des regles suit les conventions suivantes :
1. les elements terminaux du langage serontecrits dans une fonte a largeur constante, comme ceci : while.
2. les elements non terminaux du langage serontecrits en italique, comme ceci : instruction.
3. les regles de grammaires serontecrites de la maniere suivante : les parties gauches de regles seront seules sur leur ligne, cadrees a gauche et
suivies du signe deux points (:).
Chapitre 1 Les bases
Le but de ce chapitre est de presenter les elements de base du langage C, sous leur forme la plus simple. Arrive au bout du chapitre, le lecteur sera capable d’ecrire des programmes elementaires.
1.1 Les versions du langage C
Le langage C a subi au cours de son histoire deux grandes etapes de denition. Il a etedeni une premiere fois par deux chercheurs des Laboratoires Bell, B. Kernighan et D. Ritchie, dans un livre intitule (( The C Programming Language )), publie en 1978. Cette version est appelee (( Kernighan et Ritchie 78 )), ou K&R 78 en abrege, ou encore le plus souvent, simplement K&R.
Suite a l’extraordinaire succes d’unix, qui induisit le succes du langage C, la situation devint confuse : plusieurs fournisseurs de compilateurs mirent sur le marche des compilateurs non conformes a K&R car comportant des extensions particulieres. annees 80, il devint necessaire de mettre de l’ordre dans ce chaos et donc de normaliser le langage, tache a laquelle s’attela l’ansi norme ansi fut terminee en 1989. En 1990, l’iso
1A la n des , organisme de normalisation americain. La 2, organisme de normalisation international, (donc chapeautant l’ansi), adopta tel quel le standard ansi en tant que standard
1.3 Les phases de compilation
Les compilateurs C font subir deux transformations aux programmes :
1. un preprocesseur realise des transformations d’ordre purement textuel, pour rendre des services du type inclusion de source, compilation conditionnelle, et traitement de macros ;
2. le compilateur proprement dit prend le texte genere par le preprocesseur et le traduit en instructions machine.
La fonction de preprocesseur est assez souvent implementee par un programme separe (cpp sous unix) qui est automatiquement appele par le compilateur.
1.4 Les jeux de caracteres
Le lecteur non familiariseavec les problemes de codage de caracteres peut se reporter a l’annexe A, ou ces problemes sontdeveloppes. Le langage C n’impose pas un jeu de caracteres particulier. Par contre tout le langage (mots-cles, operateurs, etc.) est deni en utilisant les caracteres ascii.Meme les identicateurs doiventetre ecrits avec l’alphabet anglais. Par contre, le jeu de caracteres utilise pour les constantes caractere, les chanes de caracteres et les commentaires est dependant de l’implementation.
Pendanttres longtemps les programmeurs non anglophones ont utilisel’ascii faute de mieux, pour programmer en C. Actuellement, si on est dans le monde unix, il ne doit pasyavoir de probleme pour disposer d’un environnement de travail (la fenetre, le shell, l’editeur, le compilateur) entierement a la norme iso-8859. Dans ce manuel, on suppose que le lecteur dispose d’un tel environnement : les exemples donnes sontecrits en iso-8859.
1.5 Les unites lexicales
Le langage comprends 6 types d’unites lexicales : les mots-cles, les identicateurs, les constantes, les chanes, les operateurs et les signes de ponctuation.
1.5.1 Les mots-cles
Le langage C est un langage a mots-cles, ce qui signie qu’un certain nombre de mots sont reserves pour le langage lui-meme et ne peuvent donc pas etre utilises comme identicateurs. La liste exhaustive des mots-cles est la suivante :
Attention
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 while
Si le compilateur produit un message d’erreur syntaxique incomprehensible il est recommande d’avoir le reexe de consulter la liste des mots cles pour verier que l’on a pas pris comme identicateur un mot-cle. Si le lecteur desire etre convaincu, il lui est suggere de donner le nom long a une variable entiere.
1.5.2 Les identicateurs
Le but d’un identicateur est de donner un nom a une entite du programme (variable, procedure, etc.) Les identicateurs sont formes d’une suite de lettres, de chires et du signe souligne, suite dont le premier caractere ne peut pas etre un chire. Les lettres formant les identicateurs peuvent etre majuscules ou minuscules, mais doivent faire partie de l’alphabet anglais : les lettres accentuees sont interdites. Les noms var1, PremierIndex,itab, deb sont des identicateurs valides, mais 1i et i:j ne le sont pas.
……….
Cours Introduction au langage C Bernard Cassagne ( 938 KO) (Cours PDF)