Qu'est-ce que Évaluation en court-circuit ?

Manière d'évaluer les opérateurs logiques and (et) et or (ou) qui ignore le membre droit lorsque le membre gauche suffit à déterminer le résultat. Avec and, le membre droit n'est pas évalué si le membre gauche est faux ; avec or, s'il est vrai. On s'en sert souvent pour éviter les accès hors limites en plaçant à gauche la vérification de la plage du tableau.

Nom japonais: 短絡評価

« Évaluation en court-circuit » apparaît dans 4 questions d'entraînement réparties sur 3 thèmes, dont Bases de la programmation (trace de pseudo-code), Bases de la programmation en C, Développement logiciel et gestion de projet.

Domaine: Bases de la programmation (trace de pseudo-code)

Quand elle change le résultat

Lorsque le membre droit contient un appel de fonction ou un accès à un tableau, le résultat peut dépendre de l'évaluation en court-circuit. Dans « i ≦ n and a[i] ≠ x », dès que i dépasse n, le membre gauche est faux : a[i] n'est donc pas lu en dehors du tableau. Inverser les deux membres lirait d'abord en dehors du tableau. Si une fonction appelée dans le membre droit modifie une variable, le nombre de ses appels change aussi.

Dans les langages de programmation

Dans de nombreux langages, comme C, Java et Python, les opérateurs logiques && et || (and et or en Python) utilisent l'évaluation en court-circuit. En C et en Java, & et | évaluent toujours les deux membres. Quand l'évaluation en court-circuit influe sur le résultat d'une question en pseudo-code, on suit les explications de l'énoncé.

Écrire des conditions qui l'exploitent

L'évaluation en court-circuit permet d'écrire en une seule expression une condition qui n'a de sens que si une condition précédente est vraie, comme « dans la plage du tableau, et l'élément vérifie la condition ». Placer un test coûteux dans le membre droit permet de l'éviter quand le membre gauche décide déjà du résultat. En revanche, un traitement qui doit toujours s'exécuter ne doit pas être placé dans une fonction appelée dans le membre droit, car elle risque de ne pas être appelée.

S'entraîner : questions sur Évaluation en court-circuit

Pour la décision « A et B » (A et B sont des conditions dont les valeurs de vérité peuvent être fixées indépendamment), on a exécuté deux cas de test : (A = vrai, B = faux) et (A = faux, B = vrai). Quelle affirmation sur les critères de couverture est correcte ?

  1. ALa couverture des branches est atteinte, mais pas la couverture des conditions
  2. BLa couverture des branches et la couverture des conditions sont toutes deux atteintes
  3. CLa couverture des conditions est atteinte, mais pas la couverture des branches
Afficher la réponse et l'explication

Réponse : C. La couverture des conditions est atteinte, mais pas la couverture des branches

La couverture des conditions exige que chaque condition individuelle d'une décision (A et B) prenne au moins une fois la valeur vrai et la valeur faux. Dans les deux cas de test, A et B prennent chacune une fois vrai et faux : la couverture des conditions est donc atteinte. En revanche, « A et B » est faux dans les deux cas de test, et la branche correspondant à une décision vraie n'est jamais empruntée : la couverture des branches n'est donc pas atteinte. Comme la couverture des conditions seule ne garantit pas la couverture des branches, on utilise des critères qui satisfont les deux, comme la couverture décision/condition. Notez que ce raisonnement porte sur les valeurs données à chaque condition ; avec l'évaluation en court-circuit, comme pour && en C, où le côté droit n'est pas évalué quand le côté gauche est faux, on peut aussi ne compter que les conditions réellement évaluées.

Questions fréquentes

L'évaluation en court-circuit est-elle une optimisation ?

En C, en Java, en Python et dans les langages semblables, l'évaluation en court-circuit n'est pas une optimisation du compilateur, mais une règle de la définition du langage. Un programme qui compte sur la non-évaluation du membre droit est donc assuré de fonctionner correctement.

not (A or B) et not A and not B sont-ils équivalents ?

D'après les lois de De Morgan, ils ont la même valeur de vérité. not (i > n or a[i] = x) comme i ≦ n and a[i] ≠ x n'évaluent pas a[i] quand la condition sur i suffit à déterminer le résultat.

« Évaluation en court-circuit » dans les explications

Questions mentionnant « Évaluation en court-circuit » (4)

  1. Dans le programme suivant, and n'évalue pas son membre droit quand le membre gauche est faux (évaluation en court-circuit). cnt est une variable globale. Quelle est la valeur de cnt après l'exécution du programme ?
  2. Le programme suivant cherche la valeur x dans le tableau a de n éléments et place dans i l'indice où elle est trouvée. Les indices du tableau commencent à 1. and et or n'évaluent pas leur membre droit quand le membre gauche suffit à déterminer le résultat. Quelle condition en 【a】 lit a[n + 1], en dehors du tableau, quand x n'est pas dans a ?
  3. Quelle est la sortie obtenue en exécutant le code ci-dessus, où b++ est écrit à droite de && et de || ?
  4. Pour la décision « A et B » (A et B sont des conditions dont les valeurs de vérité peuvent être fixées indépendamment), on a exécuté deux cas de test : (A = vrai, B = faux) et (A = faux, B = vrai). Quelle affirmation sur les critères de couverture est correcte ?

Termes associés

Variable Tableau Couverture des branches (couverture des décisions) Argument Division entière Erreur d'arrondi Erreur off-by-one (erreur de décalage d'une unité) Opération bit à bit Opération modulo Programmation orientée objet

Retour au glossaire