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.

Cinq confusions fréquentes
À vérifierExempleCorrection
CasseMain ou Printfmain et printf
Format%d avec un double%f dans printf
Comparaisonif (n = 0)if (n == 0)
Produit2x2 * x
Carréx ^ 2x * 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;
}
Suivre le programme : Atelier, moyenne correctement écrite
Instruction ou étapeExplication
int a, b ; double moyenneLes 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.0Avec 11 et 14 : la somme vaut 25 ; le diviseur réel donne 12.5.
%.1fL’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.5

Sortie é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

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam