Vous êtes sur la page 1sur 214
Le langage ISO C et son environnement Versions C 90 et C 99 Jean-Paul R
Le langage ISO C et son environnement Versions C 90 et C 99 Jean-Paul R

Le langage ISO C et son environnement

Versions C90 et C99 Jean-Paul RIGAULT

V 2.1 – 7 février 2010

École polytechnique de l’université de Nice Sophia Antipolis Département de sciences informatiques 930 route des Colles — 06903 SOPHIA ANTIPOLIS Cedex, France Tél: +33 4 92 96 50 50 — Fax: +33 4 92 96 50 55

Avant-propos

C onçu à la fin des années 1960 par Dennis R itchie, le langage C s’est imposé comme une référence en matière de programmation-système et de réalisa-

tion de logiciel de base. Ceci est bien entendu lié pour parti e au succès d’Unix,

système d’exploitation pour lequel C a été conçu. Mais c’est au ssi le résultat des vertus intrinsèques du langage : suffisamment simple pour être efficace et portable, suffisamment moderne pour être expressif. Cette origine de langage de programmation-système a longte mps conféré

à C la réputation d’un langage « laxiste », dans lequel le typage n’était qu’une

contrainte surajoutée, presque décorative. Les habitudes et les exigences de programmation aidant, il était nécessaire de rendre plus ri goureux l’outil. C’est

à cette tâche que s’est consacré le comité de normalisation x3j11 de l’ ansi [ 2]. Le résultat fut un langage plus sûr, doté du typage fort garant d’une certaine sécurité de programmation, sans que cela nuise à l’efficacité des programmes générés. C’est ce langage, dit ansi C, adopté par l’ansi en 1989 puis par l’ iso en 1990 ( iso / iec 9899:1990) qui est actuellement la norme de fait. Nous le dési- gnerons simplement par C90. Cette norme a subi quelques révisions mineures jusqu’à ce que l’évolution parallèle de la normalisation du langage C++ oblige

à une reprise profonde de la norme. Ceci à conduit en 1999, à la norme iso / iec

9899:1999 reprise par l’ ansi en 2000. Le nouveau langage, dit C99, n’est pas encore à ce jour (janvier 2010) complètement implémenté par tous les compila- teurs, bien qu’un large sous-ensemble le soit généralement. Le présent texte décrit à la fois iso C90 et iso C99, en signalant les diffé- rences entre les deux versions. Ces différences sont résumé es dans l’annexe 12. Sauf mention explicite du contraire, les programmes proposés sont compatibles avec les deux versions. Pour les détails, voir la section 1.5.

Tous les exemples de cet ouvrage ont été développés et testés dans un envi- ronnement tout à fait habituel dans les établissements d’ens eignement et de re- cherche : stations de travail sous L inux, environnement graphique X Window. Le compilateur ansi C utlisé comme référence est celui de gnu dû initiale- ment à Richard Stallman (et à la Free Software Foundation ), à savoir gcc [ 1, 23]. Les programmes devraient être compilables avec les versions de gcc à partir de 2.95 au moins mais c’est seulement à partir des versions 3.x qu e l’on a la compatibilité avec C99 (option -std=c99). La compilation s’effectue sous le contrôle de make (version de gnu là en- core). La mise au point utilise gdb [ 19], autre produit de la Free Software Foun- dation , utilisé à travers l’une de ses interfaces avec X Window (principalement ddd [ 20]). Ont également été utilisés les analyseurs d’exécution gprof [ 21] et

V 2.1 – 7 février 2010

1

c Jean-Paul RIGAULT

2

Avant-propos

valgrind [ 15]. Cet environnement de travail est décrit dans le chapitre 10 où sont également introduits certains environnements intégrés de développement pour C, sous Unix ou MS Windows. Le document lui-même a été composé à l’aide de L A T E X [ 10, 26] (distribution T E XLive 2009) avec les extensions Babel [ 7] et frenchb [ 5] pour traiter la typo- graphie française, ainsi que xindy [ 14] pour générer l’index comportant des caractères accentués.

Cet ouvrage est le fruit de près de trente années d’enseigneme nt de C et d’U nix, à l’Ecole des mines de Paris, au cerics (Centre d’Enseignement et de Recherche en Informatique, Communication et Systèmes), à l ’ESSI (École Supé- rieure de Sciences Informatiques de l’université de Nice Sophia Antipolis, de- venue Polytech,Nice-Sophia) et au cours de nombreuses sessi ons de formation continue inter- et intra-entreprises que j’ai animées. Je ti ens donc à remercier tous les collègues, étudiants et participants à ces formati ons pour leur intérêt, leur patience, et leur motivation.

Jean-Paul R igault Professeur d’informatique Université de Nice Sophia Antipolis Sophia Antipolis et La Roquette sur Siagne Février 1993–Janvier 2010

Table des matières

Avant-propos

 

1

Table des matières

 

3

Table des figures

 

9

Liste des tableaux

 

11

Liste des programmes

 

13

Liste des exercices

 

15

1 Introduction

 

17

1.1

Historique

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

17

1.2

Caractéristiques de C

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

1.2.1 Un langage contemporain de Pascal

 

18

1.2.2 Un langage d’implémentation de systèmes

18

1.2.3 Un langage supportant la compilation séparée

 

18

1.2.4 Un langage

1.3

1.4 Notations utilisées

Plan .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

pour être portable . .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

19

19

1.5 Compilateurs et compatibilité

 

20

 

1.5.1 Environnement de développement de référence

 

20

1.5.2 Version du langage C

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

21

1.6 Ressources : ouvrages et sites Web sur C

 

21

1.7 Exercices du chapitre 1

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

2 Premiers pas

 

25

2.1 Monde, salut !

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

25

2.2 Boucle while ; entrées-sorties simples

 

27

2.3 Fonctions ; expressions ; entrées-sorties

29

 

2.3.1 Exemple : calcul de la racine carrée d’un réel .

.

.

.

.

.

29

2.3.2 Entrées-sorties formattées

 

33

2.4 Tableaux et instruction d’itération

35

2.5 Arguments du shell ; fonction récursive

 

38

2.6 Exercices du chapitre 2

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

41

V 2.1 – 7 février 2010

3

c Jean-Paul RIGAULT

4

TABLE DES MATIÈRES

3 Bases du langage

 

43

3.1 Eléments lexicaux

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

43

3.1.1 Jeu de caractères

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

43

3.1.2 Structure lexicale d’un fichier-source

 

44

3.1.3 Commentaires

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

45

3.1.4 Identificateurs

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

45

3.1.5 Mots-clés

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

46

3.1.6 Constantes littérales arithmétiques

 

46

3.1.7 Chaînes de caractères littérales

 

48

3.2 Types scalaires et déclarations simples

50

3.2.1 Panorama des types de C

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

50

3.2.2 Type vide ( void)

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

50

3.2.3 Types de base entiers

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

51

3.2.4 Types réels

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

53

3.2.5 Définitions d’objets de type de base scalaire

 

53

3.2.6 Types énumérés

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

54

3.2.7 Synonymie de types : typedef

 

55

3.3 Opérateurs

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

56

3.3.1 Opérateurs arithmétiques

 

56

3.3.2 Opérateurs relationnels et logiques

 

58

3.3.3 Opérateurs bit à bit .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

60

3.3.4 Affectations

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

63

3.3.5 Opérateurs sur les pointeurs

 

64

3.3.6 Opérateurs sur les types .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

64

3.3.7 Opérateurs divers

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

65

3.4 Evaluation des expressions

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

66

3.4.1 Ordre d’évaluation : précédence et associativité .

.

.

.

66

3.4.2 Conversions

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

68

3.4.3 Mélange de types dans les expressions

 

70

3.5 Instructions et flot de contrôle

 

71

3.5.1 Instruction simple et bloc

 

71

3.5.2 Instructions de sélection

72

3.5.3 Instructions de boucle

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

75

3.5.4 Instructions de rupture de séquence

 

77

3.6 Exercices du chapitre 3

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

79

4 Tableaux, structures et unions

 

83

4.1 Tableaux

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

83

4.1.1 Tableaux mono-dimensionnels

 

83

4.1.2 Tableaux multi-dimensionnels

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

86

4.1.3 Chaînes de caractères

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

88

4.1.4 Tableaux de taille variables de C99

 

88

4.2 Structures

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

90

4.2.1

Définition du type et déclarations

 

90

4.2.2

Structures compactes et champs de bits

 

93

4.2.3

Opérations sur les structures

 

94

Tableaux de structures 4.3 .

4.2.4

Unions

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

95

96

4.3.1

Définition du type

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

96

TABLE DES MATIÈRES

5

 

4.3.2 Opérations sur les unions

 

97

4.3.3 Structures avec variantes

 

97

4.4

Exercices du chapitre 4

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

100

5 Pointeurs

 

103

5.1

Déclarations et opérations sur pointeurs

 

103

5.1.1 Pointeurs simples

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

103

5.1.2 Pointeurs multiples

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

105

5.1.3 Opérations arithmétiques sur pointeurs

 

106

5.1.4 Conversions de pointeurs

 

108

5.1.5 Pointeurs et constantes

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

109

5.2

Pointeurs sur structures et unions

 

110

5.2.1 Opérateur de sélection « flêche »

 

110

5.2.2 Types récursifs

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

111

5.3

Pointeurs et tableaux

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

118

5.3.1 Tableaux de pointeurs ; lecture des déclarations de C .

118

5.3.2 Relations entre tableaux et pointeurs

 

119

5.4

Exercices du chapitre 5

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

122

6 Le préprocesseur ANSI C

 

129

6.1 Prétraitement des programmes C

 

129

6.2 Inclusion de fichier

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

130

 

6.2.1 Effet de l’inclusion de fichier

 

130

6.2.2 Recherche du fichier à inclure

 

130

6.2.3 Utilisation de l’inclusion de fichier

 

131

6.3

Définition de macros

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

131

6.3.1 Macros sans arguments : définition de constantes

 

131

6.3.2 Macros à arguments : fonctions en ligne

 

132

6.3.3 Définition récursive de macros

 

134

6.3.4 Concaténation et « stringification »

 

134

6.3.5 Annulation de définition : #undef

135

6.3.6 Macros réservées

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

135

6.4

Compilation conditionnelle

 

135

6.4.1 Les directives de compilation conditionnelle

 

135

6.4.2 Inclusion unique de fichiers

 

137

6.5

Autres directives du préprocesseur

137

6.5.1 Numéro de ligne : #line

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

138

6.5.2 Messages d’erreur : #error

 

138

6.5.3 Commentaire exécutable : #pragma

 

138

6.6

Exercices du chapitre 6

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

139

7 Fonctions

 

141

7.1 Arguments et valeur de retour

 

141

 

7.1.1 Type de retour d’une fonction

 

141

7.1.2 Type des arguments d’une fonction

 

142

7.1.3 Mode de passage des arguments

 

142

7.2 Déclaration, définition et appel de fonction

 

143

 

7.2.1 Déclaration du type d’une fonction : prototype .

.

.

.

143

7.2.2 Définition d’une fonction

 

144

6

TABLE DES MATIÈRES

7.2.3 Appel d’une fonction

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

145

7.2.4 Fonctions « en ligne » de C99

 

146

7.3 Fonctions et pointeurs

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

146

7.3.1 Fonction retournant un pointeur

 

146

7.3.2 Pointeurs en argument

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

147

7.3.3 Pointeurs sur fonctions

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

148

7.4 La fonction main

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

151

7.5 Exercices du chapitre 7

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

153

8 Structure des programmes

 

155

8.1 Espaces de nommage

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

155

8.2 Structure des programmes C

 

156

8.2.1 Compilation séparée

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

156

8.2.2 Unité de compilation

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

158

8.3 Durée de vie et règles de visibilité

 

158

8.3.1 Durée de vie

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

158

8.3.2 Visibilité des objets

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

159

8.3.3 Initialisation des objets

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

161

8.3.4 Visibilité des fonctions

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

161

8.3.5 Synthèse : relation entre durée de vie et visibilité .

.

.

162

8.3.6 Autres règles de visibilité

 

163

8.4 Programmation modulaire en C

164

8.4.1 Notion de module

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

164

8.4.2 Objets globaux trouvés dans une interface de module

165

8.4.3 Exemple d’organisation modulaire

 

166

8.5 Exercices du chapitre 8

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

167

9 La bibliothèque standard

 

171

9.1 Éléments généraux

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

171

9.1.1 Assertions : <assert.h>

 

171

9.1.2 Codes d’erreur : <errno.h>

 

171

9.1.3 Définitions communes : <stddef.h>

 

171

9.1.4 Utilitaires généraux : <stdlib.h>

 

172

9.2 Éléments numériques

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

172

9.2.1 Booléens : <stdbool.h>

 

172

9.2.2 Types entiers : <stdint.h>

 

172

9.2.3 Conversion des types entiers : <inttypes.h> .

.

.

.

172

9.2.4 Environnement pour calcul en nombres réels : <fenv.h> 172

9.2.5 Nombres complexes : <complex.h>

 

.

.

.

.

.

.

.

.

.

.

173

9.3 Fonctions mathématiques

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

173

9.3.1 Bibliothèque mathématique de base : <math.h>

 

173

9.3.2 Bibliothèque mathématique générique : <tgmath.h>

173

9.4 Caractères et chaînes de caractères

 

173

9.4.1 Manipulation de caractères : <ctype.h>

 

173

9.4.2 Manipulation de chaînes de caractères : <string.h>

173

9.4.3 Manipulation de caractères étendus: <wctype.h>

 

174

9.4.4 Manipulation de chaînes de caractères étendus : <wchar.h> 174

9.4.5 Localisation : <locale.h>

174

9.5 Entrées-sorties : <stdio.h>

174

TABLE DES MATIÈRES

7

9.6

Divers

9.6.1 Fonctions à nombre variable d’arguments : <stdarg.h> 175

174

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

9.6.2 Date et heure : <time.h>

175

9.6.3 Traitement d’événements : <signal.h>

175

9.6.4 Points de reprise : <setjmp.h>

175

9.6.5 Notation alternative de certains opérateurs : <iso646.h> 176

10

Environnement de développement

 

177

10.1 Compilateurs

.

.

.

.

.

.

.

.