Opérateurs booléens
Les opérateurs booléens combinent des opérandes de type standard booléen.
Le tableau suivant résume les opérateurs booléens:
Opérateur | Opération | Type d'Operande | Type de Resultat |
---|---|---|---|
not | Négation logique | Booléen | Booléen |
and | Et logique | Booléen | Booléen |
or | Ou logique | Booléen | Booléen |
xor | Booléen | Booléen |
L'opérateur not renvoie true si son opérande était faux, et vice versa.
L'opérateur and renvoie uniquement true si les deux opérandes étaient vrai, sinon false.
L'opérateur or renvoie true si au moins une opérande était true. Si les deux étaient false, le résultat est également false.
L'opérateur xor renvoie true si les opérandes avaient des valeurs différentes, sinon false.
Pure Pascal propose deux méthodes de génération de code différentes pour les opérateurs and et or: évaluation complète et évaluation de court-circuit. Le processus actif est déterminé par la position du commutateur du compilateur $B: $B+ provoque une évaluation complète des expressions booléennes, $B- provoque une évaluation de court-circuit. Le réglage par défaut est $B-, c'est à dire l'évaluation des courts-circuits.
Une évaluation complète signifie que les deux opérandes sont d'abord évalués, puis le résultat est calculé.
Lors de l'évaluation du court-circuit, seul l'opérande de gauche est initialement évalué. S'il s'agit d'un opérateur and et que l'opérande de gauche est déjà false, le résultat sera évalué à false. L'opérande de droite n'est alors pas du tout évalué. Avec l'opérateur or, l'opérande de droite n'est pas évalué si l'opérande de gauche a déjà abouti à true.
L'évaluation des courts-circuits est généralement la plus efficace et la plus pratique. Dans la pratique, certaines parties des conditions ne doivent souvent pas être évaluées, sinon des erreurs d'exécution se produiront.
Voici un exemple:
La deuxième condition ne doit pas être évaluée ici si le pointeur p avait déjà la valeur nil - une erreur d'exécution en résulterait.while (p <> nil) and (p^.value <> 5) do p := p^.next;