📘 Le cours : premiers pas en C
Le langage C (Dennis Ritchie, 1972) est à la base de nombreux systèmes : Linux, Windows en grande partie, et l'interpréteur Python lui-même sont écrits en C. Il est proche de la machine : tu gères toi-même les types et la mémoire, ce qui le rend très rapide… et exigeant.
De la source à l'exécutable
- Écris le code dans un fichier texte
main.c.
- Compile :
gcc -std=c11 -Wall -Wextra -o main main.c (les options -Wall -Wextra activent les avertissements utiles).
- Si le compilateur affiche des erreurs, corrige-les : tant qu'il y en a, aucun exécutable n'est produit.
- Lance le programme :
./main (Linux, macOS) ou main.exe (Windows).
main.c ──► préprocesseur ──► compilateur ──► éditeur de liens ──► main
(#include) (code machine) (+ bibliothèque C) (exécutable)
Erreur ou avertissement ?
Une erreur bloque la compilation. Un avertissement (warning) laisse compiler, mais signale presque toujours un vrai bug : traite-le comme une erreur.
Structure minimale d'un programme
#include <stdio.h> copie les déclarations de la bibliothèque d'entrées / sorties (indispensable pour printf).
int main(void) est la fonction principale ; elle renvoie un int : le code de retour donné au système (0 = tout s'est bien passé).
- Chaque instruction se termine par un point-virgule
; ; les blocs sont entourés d'accolades { }.
- L'indentation n'a aucun rôle pour le compilateur, mais elle rend le code lisible : indente toujours.
Les types de base
| Type | Contenu | Exemple | Format printf |
char | un caractère (1 octet) | 'A', '7' | %c |
int | entier relatif (en général 32 bits) | 42, -7 | %d |
long long | grand entier (64 bits) | 10000000000LL | %lld |
unsigned int | entier positif ou nul | 3000000000u | %u |
float | réel, simple précision | 3.14f | %f |
double | réel, double précision | 3.14159 | %f |
Un entier a une taille limitée : un int sur 32 bits va de −2 147 483 648 à 2 147 483 647. Au-delà, c'est un dépassement (overflow) et le résultat est faux. C'est exactement la représentation en complément à deux du chapitre Entiers signés.
Déclarer, initialiser, affecter
Une variable se déclare avec son type. Une variable locale non initialisée contient une valeur quelconque (ce qui traînait en mémoire) : initialise-la toujours.
#include <stdio.h>
int main(void) {
int a = 7; /* déclaration + initialisation */
int b; /* déclaration seule : b contient n'importe quoi */
b = a * 2; /* affectation : b vaut 14 */
a = a + 1; /* a vaut 8 */
a += 2; /* raccourci de a = a + 2 : a vaut 10 */
a++; /* incrémentation : a vaut 11 */
printf("a = %d, b = %d\n", a, b);
return 0;
}
Opérateurs arithmétiques et division entière
Les opérateurs sont +, -, *, / et % (reste de la division entière). *, / et % passent avant + et - ; les parenthèses changent l'ordre. Entre deux entiers, / fait une division entière : le résultat est tronqué. Pour obtenir un réel, au moins un des deux opérandes doit être réel.
#include <stdio.h>
int main(void) {
printf("%d\n", 7 / 2); /* division entière */
printf("%d\n", 7 % 2); /* reste */
printf("%.1f\n", 7 / 2.0); /* un opérande réel */
printf("%.1f\n", (double) 7 / 2); /* conversion (cast) avant la division */
return 0;
}
Afficher avec printf
printf remplace chaque spécificateur (%d, %f…) par la valeur correspondante, dans l'ordre. Le nombre et le type des arguments doivent correspondre aux spécificateurs, sinon le résultat est faux.
| Spécificateur | Type attendu | Exemple et affichage |
%d | int | printf("%d", 42) → 42 |
%5d | int, sur 5 caractères | printf("[%5d]", 42) → [ 42] |
%f | float ou double | printf("%f", 1.5) → 1.500000 |
%.2f | réel, 2 décimales | printf("%.2f", 3.14159) → 3.14 |
%c | char | printf("%c", 'A') → A |
%s | chaîne | printf("%s", "NSI") → NSI |
%% | aucun | printf("100%%") → 100% |
Lire au clavier avec scanf
scanf lit selon un format et range le résultat à l'adresse qu'on lui donne : d'où le & devant la variable. Pour un double, le format est %lf (et non %f, qui est réservé à printf).
#include <stdio.h>
int main(void) {
int age;
double taille;
printf("Ton age ? ");
scanf("%d", &age);
printf("Ta taille en metres ? ");
scanf("%lf", &taille);
printf("Tu as %d ans et tu mesures %.2f m.\n", age, taille);
return 0;
}
Si tu tapes 17 puis 1.78Ton age ? 17
Ta taille en metres ? 1.78
Tu as 17 ans et tu mesures 1.78 m.