Atelier de syntaxe et erreurs fréquentes
Approfondir : Atelier de syntaxe et erreurs fréquentes
Cette page reprend une ancienne adresse de syntaxe qui menait à une erreur. Elle sert maintenant d’atelier : lire un diagnostic, retrouver la faute et distinguer une erreur de compilation d’une erreur de résultat. Le cours de syntaxe de base reste la référence pour les règles générales.
Lire une instruction comme une action
Dans total = prix * quantite;, le calcul à droite est effectué puis son résultat est affecté à total. Le point-virgule termine cette instruction. Les accolades regroupent plusieurs instructions, par exemple dans un if ou une fonction. Une déclaration donne un type et un nom ; une initialisation donne aussi une première valeur. Une variable locale non initialisée ne contient pas une valeur que l’on peut supposer égale à zéro.
Les étapes d’un diagnostic
Compiler avec gcc -std=c11 -Wall -Wextra -Wpedantic fichier.c -o fichier. Commencer par le premier diagnostic : un point-virgule manquant peut provoquer une cascade de messages sur les lignes suivantes. Relire la ligne signalée et celle qui précède. Une compilation sans avertissement ne prouve toutefois pas que l’algorithme est correct ; il faut encore tester les résultats.
Trois familles de problèmes
Une faute de syntaxe, comme une accolade manquante, empêche la traduction du programme. Un symbole non résolu lors de l’édition de liens indique par exemple qu’une fonction appelée n’a pas de définition disponible. Un défaut logique produit parfois un exécutable qui tourne mais calcule la mauvaise formule. Enfin, un comportement indéfini, comme lire hors d’un tableau, n’offre aucune sortie garantie : un essai apparemment réussi ne le rend pas valide.
Affecter ou comparer
n = 0 affecte zéro à n et produit cette valeur ; n == 0 teste l’égalité. Dans un if, confondre les deux change donc à la fois les données et le choix exécuté. Les parenthèses de condition et les accolades doivent être relues avec la même attention que les formules. Ajouter des accolades même autour d’une seule instruction évite beaucoup d’erreurs lors d’une modification.
Une méthode pour tester
Choisir une entrée ordinaire, une frontière et une entrée qui doit être refusée. Écrire le résultat attendu avant d’exécuter. Pour une moyenne, tester notamment deux notes différentes afin de voir une erreur de division entière. Noter ensuite, instruction par instruction, les valeurs des variables. Cette trace permet de localiser la première étape où le programme s’écarte de l’attente.
| À vérifier | Exemple | Correction |
|---|---|---|
| Casse | Main ou Printf | main et printf |
| Format | %d avec un double | %f dans printf |
| Comparaison | if (n = 0) | if (n == 0) |
| Produit | 2x | 2 * x |
| Carré | x ^ 2 | x * x |
Atelier : moyenne correctement écrite
#include <stdio.h>
int main(void) {
int a, b;
double moyenne;
puts("Entrer deux notes entieres entre 0 et 20 :");
if (scanf("%d %d", &a, &b) != 2 ||
a < 0 || a > 20 || b < 0 || b > 20) {
puts("Saisie invalide.");
return 1;
}
moyenne = (a + b) / 2.0;
printf("Moyenne = %.1f\n", moyenne);
return 0;
}| Instruction ou étape | Explication |
|---|---|
| int a, b ; double moyenne | Les notes sont entières, mais leur moyenne peut comporter une demi-unité. |
| scanf et || | Le retour doit valoir 2 ; les notes doivent ensuite appartenir à l’intervalle annoncé. |
| (a+b)/2.0 | Avec 11 et 14 : la somme vaut 25 ; le diviseur réel donne 12.5. |
| %.1f | L’affichage conserve une décimale, au lieu de cacher la partie fractionnaire. |
Sortie écran : essai 1
La somme 25 est divisée par 2.0.
Entrer deux notes entieres entre 0 et 20 :
11 14
Moyenne = 12.5Sortie écran : essai 2
La première note sort du domaine.
Entrer deux notes entieres entre 0 et 20 :
21 10
Saisie invalide.S’entraîner et vérifier
Exercice 1. Pourquoi (11+14)/2 donne-t-il 12 dans une expression entière ?
Voir la correctionMasquer la correction
La somme et le diviseur sont des entiers : la division donne le quotient entier 12. Une affectation ultérieure à un double ne recrée pas la fraction perdue. Il faut un opérande réel dans la division, comme 2.0.
Exercice 2. Où chercher si le compilateur signale une faute sur un printf pourtant correct ?
Voir la correctionMasquer la correction
Relire aussi l’instruction précédente : son point-virgule ou sa parenthèse fermante peut manquer. Le compilateur signale parfois l’endroit où il ne peut plus poursuivre l’analyse, pas l’emplacement exact de la faute.
Pratiquer avec le TD/TP 1 corrigé · Tous les exercices C.
Repère de lecture : les codes proposés utilisent des constructions disponibles en C11. Les règles du langage et de sa bibliothèque sont consultables dans les projets publics du WG14 (C11) et du WG14 (C23). Les exemples n’utilisent pas les nouveautés propres à C23.
Questions / Réponses
Ajouter un commentaire