From 7e219d6dd679a94db64a777cc5ffd7923273183d Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Thu, 9 Apr 2026 13:13:26 +0200 Subject: [PATCH] add ch1- Normes du langage C --- 002-ch1-env.md | 311 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 002-ch1-env.md diff --git a/002-ch1-env.md b/002-ch1-env.md new file mode 100644 index 0000000..b79c223 --- /dev/null +++ b/002-ch1-env.md @@ -0,0 +1,311 @@ +# Chapitre 1 — Normes du langage C + +## 1.1 Qu’est-ce qu’une norme + +Une norme est un document officiel. +Elle définit comment un langage doit fonctionner. + +Dans le cas du C, la norme décrit : +- la syntaxe +- les types +- le comportement des instructions +- la bibliothèque standard + +Une norme permet d’assurer la compatibilité. + +Un programme conforme à la norme doit fonctionner sur plusieurs plateformes. + +Sans norme, chaque compilateur ferait différemment. + +--- + +### Exemple 1 — Code conforme à la norme + +```c +#include + +int main(void) +{ + // Code standard, portable + printf("Hello\n"); + + return 0; +} +``` + +--- + +### Exemple 2 — Code non portable + +```c +#include + +int main(void) +{ + // Fonction dépendante du système + system("pause"); + + return 0; +} +``` + +--- + +### Exemple 3 — Extension compilateur + +```c +int main(void) +{ + // Extension GCC non standard + int x = ({ int a = 5; a + 2; }); + + return x; +} +``` + +--- + +## 1.2 ANSI C / C89 / C90 + +Première norme officielle en 1989. + +Elle pose les bases du langage. + +--- + +### Exemple — Style C89 + +```c +#include + +int main(void) +{ + int a; // Déclaration en début de bloc obligatoire en C89 + a = 5; + + printf("%d\n", a); + + return 0; +} +``` + +--- + +## 1.3 C95 + +C95 est une mise à jour mineure. + +Elle ajoute : +- support des caractères larges +- améliorations de la bibliothèque + +Peu d’impact direct pour un débutant. + +--- + +## 1.4 C99 + +C99 est une évolution importante. + +Elle apporte : +- déclaration de variables n’importe où +- nouveaux types (`long long`) +- type booléen (`_Bool`) +- tableaux de taille variable (VLA) + +--- + +### Exemple — Déclaration flexible (C99) + +```c +#include + +int main(void) +{ + int a = 5; + + // Déclaration autorisée au milieu du code + int b = 10; + + printf("%d\n", a + b); + + return 0; +} +``` + +--- + +### Exemple — Booléen + +```c +#include +#include + +int main(void) +{ + bool ok = true; + + if (ok) + { + printf("OK\n"); + } + + return 0; +} +``` + +--- + +## 1.5 C11 + +C11 introduit des fonctionnalités modernes. + +Par exemple : +- threads standard +- opérations atomiques +- alignement mémoire +- assertions à la compilation + +--- + +### Exemple — Static assert + +```c +_Static_assert(sizeof(int) >= 2, "int trop petit"); +``` + +--- + +### Notion d’atomiques + +Une opération atomique est indivisible. + +Elle ne peut pas être interrompue. + +Sans atomique, deux threads peuvent modifier une variable en même temps. + +--- + +### Exemple — problème sans atomique + +```c +int compteur = 0; + +// Deux threads +compteur = compteur + 1; +``` + +--- + +### Exemple — avec atomique + +```c +#include + +int main(void) +{ + atomic_int compteur = 0; + + compteur++; + + return 0; +} +``` + +--- + +## 1.6 C17 / C18 + +Version corrective. + +Corrige des défauts de la norme précédente. + +Pas de nouvelles fonctionnalités majeures. + +--- + +## 1.7 C23 + +C23 est la version la plus récente. + +Elle modernise le langage et corrige des incohérences. + +--- + +### Nouveautés importantes + +- nouveaux mots-clés +- amélioration des types +- nettoyage de comportements historiques +- amélioration des attributs + +--- + +### Exemple — nullptr + +```c +int main(void) +{ + int *p = nullptr; // C23 + + return 0; +} +``` + +--- + +### Exemple — attribut + +```c +[[maybe_unused]] int x; +``` + +--- + +### Remarque + +C23 ne change pas la philosophie du C. +Il améliore la cohérence et la sécurité. + +--- + +## 1.8 Différences entre versions + +- C89 → base +- C99 → modernisation +- C11 → concurrence +- C17 → corrections +- C23 → nettoyage + +--- + +## 1.9 Choisir une norme + +```bash +gcc -std=c89 main.c +gcc -std=c99 main.c +gcc -std=c11 main.c +gcc -std=c17 main.c +``` + +--- + +## 1.10 Extensions de compilateur + +Les extensions ne font pas partie du standard. + +Elles peuvent être utiles. +Mais elles réduisent la portabilité. + +--- + +### Exemple — extension GNU + +```c +int main(void) +{ + int x = ({ int a = 10; a * 2; }); + + return x; +} +```