L'ordre des conditions protège un accès
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 1 — Le langage C
Énoncé
Ces deux fonctions sont-elles équivalentes ? Si non, laquelle est correcte, et pourquoi ?
bool premier_nul_A(const int t[], int n, int i) {
return t[i] == 0 && i < n;
}
bool premier_nul_B(const int t[], int n, int i) {
return i < n && t[i] == 0;
}Corrigé
Elles ne sont pas équivalentes, et seule premier_nul_B est correcte.
L'évaluation de && est paresseuse : le second opérande n'est évalué que si le premier est vrai.
- Dans B, si , l'expression vaut
falsesans quet[i]soit jamais lu. L'ordre protège l'accès. - Dans A,
t[i]est lu avant le test de borne. Pour , c'est un accès hors tableau — que le langage ne vérifie pas. Le programme lira une valeur quelconque, et pourra même planter.
Règle générale : dans une conjonction, la condition qui garde vient toujours en premier. C'est un usage de la paresse comme outil de correction, et non comme optimisation.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.