1 Historique et présentation
1.1 Historique
1.2 Présentation du langage
1.3 Idées fondamentales
1.4 En-chaîneur de passes
1.4.1 Pré-processeur
1.4.2 Compilateur
1.4.3 Optimiseur de code
1.4.4 Assembleur
1.4.5 Éditeur de liens
1.4.6 Quelques options de cc
2 Généralités sur la syntaxe
2.1 Mise en page
2.1.1 Identifiant
2.1.2 Espaces lexicaux
2.2 Mots réservés
2.3 Constantes
2.4 Instructions
3 Types et variables
3.1 Types de base
3.1.1 Types entiers
3.1.2 Types avec parties décimales
3.1.3 Tailles des types
3.2 Constantes associées aux types de base
3.2.1 Constantes de type entier
3.2.2 Constantes avec partie décimale
3.2.3 Constantes de type caractère
3.2.4 Chaînes de caractères
3.3 Qualificatifs
3.4 Taille et normalisation
3.5 Définition de variables
3.6 Types dérivés des types de base
3.6.1 Tableaux et structures
3.6.2 Pointeurs
3.7 Initialisation de variables
3.8 Conversion de type
3.8.1 Conversions implicites
3.9 Déclaration et définition
3.10 Exercices sur les types et variables
3.10.1 Exercice 1
3.10.2 Exercice 2
3.10.3 Exercice 3
3.10.4 Exercice 4
4 Eléments de base
4.1 Bonjour
4.2 Lire et écrire
4.3 Quelques opérations
4.4 Plus sur printf() et scanf()
4.5 Exercices sur printf() et scanf()
4.5.1 Exercice 1
4.5.2 Exercice 2
4.5.3 Exercice 3
4.5.4 Exercice 4
5 Opérateurs et expressions
5.1 Opérateurs un-aires
5.1.1 Opérateur de référencement
5.1.2 Opérateur de déréférencement ou indirection
5.1.3 Utilisation des & et *
5.1.4 Opérateurs d’incrémentation et de décrémentation
5.1.5 Opérateur de taille
5.1.6 Opérateur de négation logique
5.1.7 Plus et moins unaires
5.1.8 Complément à un
5.2 Opérateurs binaires
5.2.1 Opérateurs arithmétiques
3.2.4 Chaînes de caractères
3.3 Qualificatifs
3.4 Taille et normalisation
3.5 Définition de variables
3.6 Types dérivés des types de base
3.6.1 Tableaux et structures
3.6.2 Pointeurs
3.7 Initialisation de variables
3.8 Conversion de type
3.8.1 Conversions implicites
3.9 Déclaration et définition
3.10 Exercices sur les types et variables
3.10.1 Exercice 1
3.10.2 Exercice 2
3.10.3 Exercice 3
3.10.4 Exercice 4
4 Eléments de base
4.1 Bonjour
4.2 Lire et écrire
4.3 Quelques opérations
4.4 Plus sur printf() et scanf()
4.5 Exercices sur printf() et scanf()
4.5.1 Exercice 1
4.5.2 Exercice 2
4.5.3 Exercice 3
4.5.4 Exercice 4
5 Opérateurs et expressions
5.1 Opérateurs un-aires
5.1.1 Opérateur de référencement
5.1.2 Opérateur de déréférencement ou indirection
5.1.3 Utilisation des & et *
5.1.4 Opérateurs d’incrémentation et de décrémentation
5.1.5 Opérateur de taille
5.1.6 Opérateur de négation logique
5.1.7 Plus et moins unaires
5.1.8 Complément à un
5.2 Opérateurs binaires
5.2.1 Opérateurs arithmétiques
5.2.2 Opérateurs manipulant les bits
5.2.3 Opérateurs de décalage
5.2.4 Opérateurs de relation
5.2.5 Opérateur binaire d’affectation et de succession
5.2.6 Opérateurs d’affectation
5.2.7 Opérateur ternaire
5.2.8 Précédence des opérateurs
5.3 Expressions
5.4 Instructions
5.5 Exercices sur les opérateurs et les expressions
5.5.1 Exercice 1
5.5.2 Exercice 2
5.5.3 Exercice 3
5.5.4 Exercice 4
5.5.5 Exercice 5 : Operateur ternaire
5.5.6 Exercice 6
6 Instructions de contrôle
6.1 Instructions conditionnelles
6.1.1 Test
6.1.2 Table de branchement
6.2 Instructions itératives
6.2.1 while
6.2.2 for
6.2.3 do while
6.2.4 Remarques sur les instructions itératives
6.3 Ruptures de séquence
6.3.1 continue
6.3.2 break
6.3.4 return
6.4 Exercices sur les instructions de contrôle
6.4.1 Exercice 1
6.4.2 Exercice 2
6.4.3 Exercice 3
6.4.4 Exercice 4
6.5 Exercices sur les ruptures de séquence
6.5.1 Exercice 5
6.5.2 Exercice 6
7 Programmation structurée
7.1 Historique
7.2 Idées fondamentales
7.3 Langage C et programmation structurée
7.3.1 Ambitions du langage C
7.3.2 C et structures fondamentales
7.4 Quelques exemples.
7.4.1 Exemple avec des tests
7.4.2 Exemple avec une boucle
8 Fonctions
8.1 Définition d’une fonction
8.2 Retour de fonction
8.3 Passage des paramètres
8.3.1 Passage de constantes
8.3.2 Passage de variables
8.4 Utilisation de pointeurs en paramètres
8.5 Conversion de type lors des appels
8.6 Récursivité
8.7 Arguments de la fonction main()
8.8 Pointeur de fonction
8.9 Étapes d’un appel de fonction
8.10 Exercices sur les fonctions
8.10.1 Exercice 1
8.10.2 Exercice 2
8.10.3 Exercice 3
9 Compilations séparée
9.1 Programme
9.2 Fichier source
9.3 Visibilité
9.3.1 Espaces de nommage et visibili
9.3.2 Extension de la visibilité
9.4 Prototypes des fonctions
9.5 Fonctions externes
9.6 Fonctions définies ultérieurement
9.7 Vérification des prototypes
9.8 Multiples déclarations et définitions
9.8.1 Fichiers d’inclusion
9.8.2 Réduction de la visibilité
9.8.3 Variables locales rémanentes
9.8.4 Travailler en groupe
9.9 Exercices sur les fonctions et la visibilité des variables
9.9.1 Exercice 1 : simulation d’un ascenseur
9.9.2 Exercice 2 : racines d’une équation du deuxième degré
9.9.3 Exercice 3 : utilisation des fichiers d’inclusion
10 Pointeurs et tableaux
10.1 Tableaux à une dimension
10.2 Arithmétique d’adresse et tableaux
10.3 Tableaux multidimensionnels
10.4 Pointeurs et tableaux
10.5 Tableau de pointeurs
10.6 Pointeurs vers un tableau
10.7 Exercices sur les tableaux et les pointeur
10.7.1 Exercice 1 : tri de tableaux d’ent
11 Structures
11.1 Définition
11.2 Utilisation
11.2.1 Opérations sur les champs
11.2.2 Opérations sur la variable dans s
11.3 Structures et listes chaînées
11.4 Champs de bits
11.5 Exercices sur les structures
11.5.1 Exercice 1
12 Unions
12.1 Définition
12.2 Accès aux champs
12.3 Exercices sur les unions et les champs de
12.3.1 Exercice 1
12.3.2 Exercice 2
13 Énumérations
13.1 Définition
13.2 Utilisation
13.3 Limites des énumérations
16.5.5 Conversion dans les fichiers
16.6 Déplacement dans le fichier
16.7 Gestion des tampons
16.8 Gestion des erreurs
17 Autres fonctions de la bibliothèque
17.1 Fonctions de manipulation de chaînes
17.2 Types de caractères
17.3 Quelques fonctions générales
17.3.1 system()
14.1 Types synonymes
14.2 Types complexes
14.3 Fonctions et tableaux
14.4 Exercices sur les déclarations complexes
14.4.1 Exercice 1
14.4.2 Exercice 2
14.4.3 Exercice 3
15 Préprocesseur
15.1 Commentaires
15.2 Inclusion de fichiers
15.3 Variables de pré-compilation
15.3.1 Définition de constantes de compilation
15.3.2 Définition destinée à la sélection
15.4 Définition de macro-expressions
15.5 Effacement d’une définition
15.6 Définition à l’appel de l’enchaîneur de passes
15.7 Sélection de code
15.7.1 Sélection avec #if
15.7.2 Sélection avec #ifdef et #ifndef
15.8 Exercices sur le préprocesseur
15.8.1 Exercice 1
15.8.2 Exercice 2
16 Entrées-sorties de la bibliothèqu
16.1 Entrée-sorties standards
16.1.1 Échanges caractère par caractère
16.1.2 Échanges ligne par ligne
16.1.3 Échanges avec formats
16.2 Ouverture d’un fichier
16.3 Fermeture d’un fichier
16.4 Accès au contenu du fichier
16.4.1 Accès caractère par caractère
16.4.2 Accès ligne par ligne
16.4.3 Accès enregistrement par enregistremen
16.5 Entrée-sorties formatées
16.5.1 Formats : cas de la lecture
16.5.2 Formats : cas de l’écriture
16.5.3 Conversion sur les entrée-sorties standar
16.5.4 Conversion en mémoire
17.3.2 exit()
GNU Free Documentation License
17.4 Applicability and Definitions
17.5 Verbatim Copying
17.6 Copying in Quantity
17.7 Modifications
17.8 Combining Documents
17.9 Collections of Documents
17.10Aggregation With Independent Works
17.11Translation
17.12Termination
17.13Future Revisions of This License
Liste des programmes exemples
Liste des figures
Liste des tableaux
Bibliographie
Index
Chapitre 1: Historique et présentation
Ce chapitre essaye de placer le langage C [BK78] dans son contexte historique et technique, de manière à approcher l’état d’esprit du langage qui nous permet de deviner les règles sous-jacentes au langage sans pour cela avoir à les mémoriser.
1.1 Historique
Le langage C [DR78] est lié à la conception du système UNIX par les Bell-Labs. Les langages ayant influencé son développement sont :
– le langage BCPL de M. Richards 1967 ;
– le langage B développé aux Bell-Labs 1970.
Ces deux langages partagent avec le langage C :
– les structures de contrôle ;
– l’usage des pointeurs ;
– la récursivité.
Ces deux langages prédécesseurs du C avaient la particularité d’être sans type. Ils ne travaillaient que sur des données décrites par un mot machine ce qui leur donnait un degré de portabilité nul. Le langage C comble ces lacunes en introduisant des types de données tels que l’entier, ou le caractère.
1.2 Présentation du langage
Le langage C est un langage de bas niveau dans le sens où il permet l’accès à des données que manipulent les ordinateurs (bits, octets, adresses) et qui ne sont pas souvent disponibles à partir de langages évolués tels que Fortran, Pascal ou ADA.
Le langage C a été conçu pour l’écriture de systèmes d’exploitation et du logiciel de base. Plus de 90% du noyau du système UNIX est écrit en langage C. Le compilateur C lui-même est écrit en grande partie en langage C ou à partir d’outils générant du langage C [SJ78]. Il en est de même pour les autres outils de la chaîne de compilation (assembleur, éditeur de liens, pré-processeur). De plus, tous les utilitaires du système sont écrits en C (shell, outils). Il est cependant suffisamment général pour permettre de développer des applications variées de type scientifique ou encore pour l’accès aux bases de données. Par le biais des bases de données, il est utilisé dans les applications de gestion. De nombreux logiciels du domaine des ordinateurs personnels, tels que Microsoft Word ou Microsoft Excel, sont eux-aussi écrits à partir de langage C ou de son successeur orienté objet : C++ [Str86].
1.3 Idées fondamentales
Il est difficile de présenter les différents concepts du langage indépendemment les uns des autres, c’est pourquoi, certains concepts, comme la visibilité des variables, sont abordés dans les premiers chapitres pour n’être approfondis que plus tard.
Nous allons décrire les principales composantes d’un programme écrit en langage C. Comme il est montré dans la figure 1.1, un programme en C est constitué d’un ensemble de fichiers sources destinés à être compilés séparément et à subir une édition de liens commune. Ces fichiers sources sont aussi appelés modules et ce type de programmation est appelé programmation modulaire. Les notions de visibilités associées à la programmation modulaire sont approfondies dans le chapitre 9.
1.4 En-chaîneur de passes
L’étude des différentes actions entreprises lors de ce que nous appelons de manière abusive la compilation, permet de mieux comprendre de quel outils proviennent les différentes caractéristiques de la programmation en langage C.
Nous prenons le cas des outils utilisés dans les systèmes de type UNIX car les actions sont facilement séparables. Dans un système de type UNIX, pour obtenir un fichier exécutable à partir d’un source C, la commande usuelle est cc cc options nom_du_fichier.c Ces “compilateurs” sont en fait des en-chaîneurs de passes ; nous allons voir l’usage, le fonctionnement, et les options de cc. Cet outils sert à appeler les différents utilitaires nécessaires à la transformation d’un programme C en un fichier exécutable. L’en-chaîneur de passes cc met en œuvre cinq utilitaires.
1.4.1 Pré-processeur
Le pré-processeur ou pré-compilateur est un utilitaire qui traite le fichier source avant le compilateur.
C’est un manipulateur de chaînes de caractères. Il retire les parties de commentaires, qui sont comprises entre /* et */. Il prend aussi en compte les lignes du texte source ayant un # en première colonne pour créer le texte que le compilateur analysera. Ses possibilités sont de trois ordres (voir chap. 15) :
– inclusion de fichiers ;
– définition d’alias et de macro-expressions ;
– sélection de parties de texte.
1.4.2 Compilateur
Le compilateur lit ce que génère le pré-processeur et crée les lignes d’assembleur correspondantes.
Le compilateur lit le texte source une seule fois du début du fichier à la fin. Cette lecture conditionne les On voit apparaître une définition récursive à l’intérieur du langage : à savoir un bloc contient des instructions qui peuvent être des blocs qui contiennent des instructions, . . .
Les expressions sont explicitées dans le chapitre 5. cc ou tout autre “compilateur” comme gcc..
Formation langage C (768 Ko) (Cours PDF)