I – Eléments de base
I-A – Structure générale d’un programme
I-B – Considérations lexicales
I-B-1 – Présentation du texte du programme
I-B-2 – Mots-clés
I-B-3 – Identificateurs
I-B-4 – Opérateurs
I-C – Constantes littérales
I-C-1 – Nombres entiers
I-C-2 – Nombres flottants
I-C-3 – Caractères et chaines de caractères
I-C-4 – Expressions constantes
I-D – Types fondamentaux
I-D-1 – Nombres entiers et caractères
I-D-2 – Types énumérés
I-D-3 – Nombres flottants
I-E – Variables
I-E-1 – Syntaxe des déclarations
I-E-2 – Visibilité des variables
I-E-3 – Allocation et durée de vie des variables
I-E-4 – Initialisation des variables
I-E-5 – Variables locales statiques
I-E-6 – Variables critiques
I-E-7 – Variables constantes et volatiles
I-F – Variables, fonctions et compilation séparée
I-F-1 – Identificateurs publics et privés
I-F-2 – Déclaration d’objets externes
II – Opérateurs et expressions
II-A – Généralités
II-A-1 – Lvalue et rvalue
II-A-2 – Priorité des opérateurs
II-B – Présentation détaillée des opérateurs
II-B-1 – Appel de fonction ()
II-B-2 – Indexation []
II-B-3 – Sélection .
II-B-4 – Sélection dans un objet pointé ->
II-B-5 – Négation !
II-B-6 – Complément à 1 ~
II-B-7 – Les célèbres ++ et –
II-B-8-Moins unaire
II-B-9-Indirection*
II-B-10-Obtention de l’adresse &
II-B-11-Opérateur sizeof
II-B-12-Conversion de type (\cast » operator)
II-B-13 –Opérateurs arithmétiques
II-B-14-Décalages << >>
II-B-15-Comparaisons == != < <= > >=
II-B-16-Opérateurs de bits & j ^
II-B-17-Connecteurs logiques && et ||
II-B-18-Expression conditionnelle ?:
II-B-19-Affectation=
II-B-20 – Autres opérateurs d’affectation += *= etc.
II-B-21 – L’opérateur virgule ,
II-C – Autres remarques
II-C-1 – Les conversions usuelles
II-C-2 – L’ordre d’évaluation des expressions
II-C-3 – Les opérations non abstraites
III – Instructions
III-A – Syntaxe
III-B – Présentation détaillée des instructions
III-B-1 – Blocs
III-B-2 – Instruction-expression
III-B-3 – Etiquettes et instruction goto
III-B-4 – Instruction if…else…
III-B-5 – Instructions while et do…while
III-B-6 – Instruction for
III-B-7 – Instruction switch
III-B-8 – Instructions break et continue
III-B-9 – Instruction return
IV – Fonctions
IV-A – Syntaxe ANSI ou \avec prototype »
IV-A-1 – Définition
IV-A-2 – Type de la fonction et des arguments
IV-A-3 – Appel des fonctions
IV-A-4 – Déclaration \externe » d’une fonction
IV-B – Syntaxe originale ou \sans prototype »
IV-B-1 – Déclaration et définition
IV-B-2 – Appel
IV-B-3 – Coexistence des deux syntaxes
IV-C – Arguments des fonctions
IV-C-1 – Passage des arguments
IV-C-2 – Arguments de type tableau
IV-C-3 – Arguments par adresse
IV-C-4 – Arguments en nombre variable
V – Objets structurés
V-A – Tableaux
V-A-1 – Cas général
V-A-2 – Initialisation des tableaux
V-A-3 – Chaines de caractères
V-B – Structures et unions
V-B-1 – Structures
V-B-2 – Unions
V-B-3 – Champs de bits
V-C – Enumérations
V-D – Déclarateurs complexes
V-D-1 – Cas des déclarations
V-D-2 – Pointeurs et tableaux constants et volatils
V-D-3 – La déclaration typedef
V-D-4 – Cas des types désincarnés
VI – Pointeurs
VI-A – Généralités
VI-A-1 – Déclaration et initialisation des pointeurs
VI-A-2 – Les pointeurs génériques et le pointeur NULL
VI-B – Les pointeurs et les tableaux
VI-B-1 – Arithmétique des adresses, indirection et indexation
VI-B-2 – Tableaux dynamiques
VI-B-3 – Tableaux multidimensionnels
VI-B-4 – Tableaux multidimensionnels dynamiques
VI-B-5 – Tableaux de chaines de caractères
VI-B-6 – Tableaux multidimensionnels formels
VI-B-7 – Tableaux non nécessairement indexés à partir de zéro
VI-B-8 – Matrices non dynamiques de taille inconnue
VI-C – Les adresses des fonctions
VI-C-1 – Les fonctions et leurs adresses
VI-C-2 – Fonctions formelles
VI-C-3 – Tableaux de fonctions
VI-C-4 – Flou artistique
VI-D – Structures récursives
VI-D-1 – Déclaration
VI-D-2 – Exemple
VI-D-3 – Structures mutuellement récursives
VII – Entrées-sorties
VII-A – Flots
VII-A-1 – Fonctions générales sur les flots
VII-A-2 – Les unités standard d’entrée-sortie
VII-B – Lecture et écriture textuelles
VII-B-1 – Lecture et écriture de caractères et de chaines
VII-B-2 – Ecriture avec format printf
VII-B-3 – Lecture avec format scanf
VII-B-4 – A propos de la fonction scanf et des lectures interactives
VII-B-5 – Les variantes de printf et scanf
VII-C – Opérations en mode binaire
VII-C-1 – Lecture-écriture
VII-C-2 – Positionnement dans les fichiers
VII-D – Exemples
VII-D-1 – Fichiers \en vrac »
VII-D-2 – Fichiers binaires et fichiers de texte
VII-D-3 – Fichiers en accès relatif
VII-E – Les fichiers de bas niveau d’UNIX
VIII – Autres éléments du langage C
VIII-A – Le préprocesseur
VIII-A-1 – Inclusion de fichiers
VIII-A-2 – Définition et appel des \macros »
VIII-A-3 – Compilation conditionnelle
VIII-B – La modularité de C
VIII-B-1 – Fichiers en-tête
VIII-B-2 – Exemple : stdio.h
VIII-C – Deux ou trois choses bien pratiques…
VIII-C-1 – Les arguments du programme principal
VIII-C-2 – Branchements hors fonction : setjmp.h
VIII-C-3 – Interruptions : signal.h
VIII-D – La bibliothèque standard
VIII-D-1 – Aide à la mise au point : assert.h
VIII-D-2 – Fonctions utilitaires : stdlib.h
VIII-D-3 – Traitement de chaines : string.h
VIII-D-4 – Classification des caractères : ctype.h
VIII-D-5 – Fonctions mathématiques : math.h
VIII-D-6 – Limites propres à l’implémentation : limits.h, float.h
I – Eléments de base
I-A – Structure générale d’un programme
La transformation d’un texte écrit en langage C en un programme exécutable par l’ordinateur se fait en deux étapes : la compilation et l’édition de liens. La compilation est la traduction des fonctions écrites en C en des procédures équivalentes écrites dans un langage dont la machine peut exécuter les instructions. Le compilateur lit toujours un fichier, appelé fichier source, et produit un fichier, dit fichier objet.
Chaque fichier objet est incomplet, insuffisant pour être exécuté, car il contient des appels de fonctions ou des références à des variables qui ne sont pas définies dans le même fichier. Par exemple, le premier programme que vous écrirez contiendra déjà la fonction printf que vous n’aurez certainement pas écrite vous-même. L’édition de liens est l’opération par laquelle plusieurs fichiers objets sont mis ensemble pour se compléter mutuelle- ment : un fichier apporte des définitions de fonctions et de variables auxquelles un autre fichier fait référence et réciproquement.
L’éditeur de liens (ou linker ) prend en entrée plusieurs fichiers objets et bibliothèques (une variété particulière de fichiers objets) et produit un unique fichier exécutable. L’éditeur de liens est largement indépendant du langage de programmation utilisé pour écrire les fichiers sources, qui peuvent même avoir été écrits dans des langages différents.
I-B – Considérations lexicales
I-B-1 – Présentation du texte du programme
Le programmeur est maitre de la disposition du texte du programme. Des blancs, des tabulations et des sauts à la ligne peuvent être placés à tout endroit ou cela ne coupe pas un identificateur, un nombre ou un symbole composé2.
Les commentaires commencent par /* et se terminent par */ :
/* Ce texte est un commentaire et sera donc ignoré par le compilateur */
Les commentaires ne peuvent pas être imbriqués : écrit dans un programme, le texte « /* voici un grand
/* et un petit */ commentaire */ » est erroné, car seul « /* voici un grand /* et un petit */ »
sera vu comme un commentaire par le compilateur.
Les langages C et C++ cohabitant dans la plupart des compilateurs actuels, ces derniers acceptent également comme commentaire tout texte compris entre le signe // et la fin de la ligne ou ce signe apparait :
// Ceci est un commentaire à la mode C++.
Le caractère anti-slash \ précédant immédiatement un saut à la ligne masque ce dernier : la ligne suivante est considérée comme devant être concaténée à la ligne courante. Cela est vrai en toute circonstance, y compris à l’intérieur d’une chaine de caractères.
I-B-3 – Identificateurs
Un identificateur est une suite de lettres et chiffres contigus, dont le premier est une lettre. Lorsque seul le compilateur est concerné, c’est-à-dire lorsqu’il s’agit d’identificateurs dont la portée est incluse dans un seul fichier (nous dirons de tels identificateurs qu’ils sont privés) : en toute circonstance une lettre majuscule est tenue pour différente de la lettre minuscule correspondante ; dans les identificateurs, le nombre de caractères discriminants est au moins de 31.
I-C – Constantes littérales
I-C-1 – Nombres entiers
Les constantes littérales numériques entières ou réelles suivent les conventions habituelles, avec quelques particularités Les constantes littérales sont sans signe : l’expression ¡123 est comprise comme l’application de l’opérateur unaire ¡ à la constante 123 ; mais puisque le calcul est fait pendant la compilation, cette subtilité n’a aucune conséquence pour le programmeur. Notez aussi qu’en C original, comme il n’existe pas d’opérateur + unaire, la notation +123 est interdite.
Les constantes littérales entières peuvent aussi s’écrire en octal et en hexadécimal : une constante écrite en octal (base 8) commence par 0 (zéro) ; une constante écrite en hexadécimal (base 16) commence par 0x ou 0X…
Elément de base, opérateurs et expressions (711 KO) (Cours PDF)