Sommaire: initiation pragmatique au langage C
I – Introduction
II – Programme minimum
II-A – Analyse détaillée
III – Un programme qui dit « bonjour
IV – Glossaire
IV-A – BitIV-B – Byte
IV-C – Caractère
IV-D – Chaîne de caractères
IV-E – Comportement indéfini
IV-F – Fonction
IV-G – Flux
IV-H – Paramètre
IV-I – Préprocesseur
IV-J – printf
IV-J-1 – Les principaux formateurs de printf()
IV-J-2 – Exemples d’utilisation de printf
IV-K – Prototype
IV-L – sizeof
IV-M – Tableau
IV-N – Type
Extrait du cours initiation pragmatique au langage C
I – Introduction
Il existe de nombreuses façons d’expliquer les bases d’un langage de programmation. J’ai choisi une approche progressive, mais concrète et basée sur l’expérimentation. Les informations données ne prétendent pas être exhaustives, et font référence à la définition du langage C selon la norme ISO/IEC 9899:1990 (appelée aussi C90).
Pour les détails, il est conseillé de se munir d’un livre de référence comme The C programming language (et son correctif) de Brian Kernighan et Dennis Ritchie ou sa version française : Le langage C. Les solutions aux exercices sont dévoilées ici.
Le langage C est un langage normalisé qui comprend des instructions de préprocesseur, des instructions C, et des symboles dont la sémantique peut varier selon le contexte.
II – Programme minimum
Voici le programme C le plus simple que l’on puisse écrire.
int main (void)
{
return 0;
}
Ce programme est composé de plusieurs mots clés faisant partie du langage C : int, void et return Il utilise aussi 5 symboles syntaxiques, à savoir (, ), {, } et ;. Enfin, il utilise un mot défini par l’utilisateur : main Ce programme ne fait rien de visible. Cependant, il met en uvre la structure de code de base du langage C, à savoir la fonction.
II-A – Analyse détaillée
Nous allons étudier les mots et le symboles qui constituent le programme dans l’ordre de leur apparition.
int est un type. Ici, il qualifie la valeur retournée par la fonction.
main est un identificateur défini par l’utilisateur. Utilisé dans ce contexte, il désigne le nom de la fonction. Cet identificateur a cependant un sens particulier. Il designe le point d’entrée du programme. Cela signifie qu’un programme C commencera toujours par un appel ‘invisible’ à la fonction main(). Cet appel provient de la séquence d’initialisation du programme. Les détails dépendent de l’implémentation, mais, d’une manière simplifiée, voici quel est le déroulement des opérations:
1 chargement du logiciel
2 exécution du code d’initialisation (« boot »)
3 appel de l’application (CALL MAIN)
4 exécution de l’application, jusqu à la fin de main()
5 exécution du code de fin
6 retour au système.
III – Un programme qui dit « bonjour »
Voici une version un peu plus élaborée, qui se contente d’afficher une simple phrase (« Hello world! ») sur la sortie standard (généralement l’écran).
#include <stdio.h>
int main (void)
{
puts (« Hello world! »);
return 0;
}
Dans ce programme, on constate l’ajout du mot clé #include et de son paramètre <stdio.h>, ainsi que la fonction puts(). et de son paramètre « Hello world! ».
On remarque que le mot clé #include commence par un ‘#’. En effet, ce mot clé appartient à la famille des commandes du préprocésseur, dont une caractéristique est justement de commencer par ‘#’.
#include <stdio.h> signifie que le fichier indiqué en paramètre est inclus dans le code source. Cette opération (ainsi que toutes les opérations du préprocesseur) est effectuée avant la traduction du code.
Cette opération d’inclusion est rendue nécessaire à cause de l’appel à la fonction puts(). En effet, il est recommandé (et parfois obligatoire) de fournir au compilateur un prototype à la fonction utilisée :
int puts (char const *);
La fonction puts() appartient à la bibliothèque standard du langage C, qui fait partie intégrante du langage. La définition du prototype de cette fonction se trouvant dans le fichier d’en-tête <stdio.h>, il est donc tout à fait logique d’inclure ce fichier dans le fichier source.
IV – Glossaire
IV-A – Bit
Le bit (BInary digiT) ou chiffre binaire est l’unité de mesure d’information. Il peut prendre 2 valeurs : 0 ou 1.
IV-B – Byte
Le byte (ou multiplet) est le plus petit objet adressable pour une implémentation donnée. En langage C, il fait au moins huit bits.
IV-C – Caractère
Un caractère est une valeur numérique qui représente un glyphe visible (‘A’, ‘5’, ‘*’ etc.) ou non (CR, LF etc.). Un caractère est de type int. Cependant, sa valeur tient obligatoirement dans un type char.
Un objet de la taille d’un byte peut recevoir la valeur de n’importe quel caractère.
IV-D – Chaîne de caractères
Une chaîne de caractères est une séquence de caractères encadrée de double quotes.
« Hello world! »
La représentation interne d’une chaîne de caractères est spécifiée. C’est un tableau de char terminé par un 0. char s[] = « Hello »;
IV-E – Comportement indéfini
Un comportement indéfini (encore appelé Undefined Behaviour ou UB) est un bug grave. Il signifie que le comportement du programme est imprévisible et que tout peut arriver, y compris, et c’est ça qui rend ce bug très dangereux, un comportement d’apparence conforme.
Il n’existe pas de moyen automatique de détecter tous les UB d’un programme. Seul un contrôle visuel fait par une personne chevronnée permet de détecter un tel bug.
IV-F – Fonction
Une fonction est une séquence d’instructions dans un bloc nommé. Une fonction est constituée de la séquence suivante :
• Un type (ou le mot clé void)
• Un identificateur (le nom de la fonction, ici main)
• Une parenthèse ouvrante (
• Une liste de paramètres ou une liste vide (dans ce cas, on écrit void)
• Une parenthèse fermante )
…….
Cours gratuit initiation pragmatique au langage C (292 KO) (Cours PDF)