Opérateurs de bits et opérateurs logiques en Visual Basic
Les opérateurs logiques comparent les expressions Boolean
et renvoient un résultat Boolean
. Les opérateurs And
, Or
, AndAlso
, OrElse
et Xor
sont binaires, car ils prennent deux opérandes, tandis que l’opérateur Not
est unaire, car il prend un seul opérande. Certains de ces opérateurs peuvent également effectuer des opérations logiques au niveau du bit sur des valeurs intégrales.
Opérateur logique unaire
L’Opérateur Not effectue une négation logique sur une expression Boolean
. Il produit le contraire logique de son opérande. Si l’expression correspond à la valeur True
, Not
renvoie False
; si l’expression correspond à la valeur False
, Not
renvoie True
. L'exemple suivant illustre ce comportement.
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
Opérateurs logiques binaires
L’Opérateur And effectue une conjonction logique sur deux expressions Boolean
. Si les deux expressions donnent True
, And
renvoie True
. Si au moins une des expressions donne False
, And
renvoie False
.
L’Opérateur Or effectue une disjonction ou une inclusion logiques sur deux expressions Boolean
. Si l’une ou l’autre expression donne True
, ou si les deux donnent True
, Or
renvoie True
. Si aucune expression ne donne True
, Or
retourne False
.
L’Opérateur Xor effectue une exclusion logique sur deux expressions Boolean
. Si exactement une expression donne True
, mais pas les deux, Xor
renvoie True
. Si les deux expressions donnent True
ou que les deux donnentFalse
, Xor
renvoie False
.
L’exemple suivant illustre les opérateurs And
, Or
et Xor
.
Dim a, b, c, d, e, f, g As Boolean
a = 23 > 14 And 11 > 8
b = 14 > 23 And 11 > 8
' The preceding statements set a to True and b to False.
c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.
e = 23 > 67 Xor 11 > 8
f = 23 > 14 Xor 11 > 8
g = 14 > 23 Xor 8 > 11
' The preceding statements set e to True, f to False, and g to False.
Opérations logiques de court-circuit
L’Opérateur AndAlso est très similaire à l’opérateur And
, car il effectue également une conjonction logique sur deux expressions Boolean
. La principale différence entre les deux est que AndAlso
présente un comportement de court-circuit. Si la première expression d’une expression AndAlso
donne False
, la deuxième expression n’est pas évaluée, car elle ne peut pas modifier le résultat final, et AndAlso
renvoie False
.
De même, l’Opérateur OrElse effectue une disjonction logique de court-circuit sur deux expressions Boolean
. Si la première expression d’une expression OrElse
donne True
, la deuxième expression n’est pas évaluée, car elle ne peut pas modifier le résultat final, et OrElse
renvoie True
.
Compromis de court-circuitage
Le court-circuitage peut améliorer les performances en n’évaluant pas une expression qui ne peut pas modifier le résultat de l’opération logique. Toutefois, si cette expression effectue des actions supplémentaires, le court-circuitage ignore ces actions. Par exemple, si l’expression inclut un appel à une procédure Function
, cette procédure n’est pas appelée si l’expression est court-circuitée, et tout code supplémentaire contenu dans le Function
ne s’exécute pas. Par conséquent, la fonction peut n'être exécutée qu'occasionnellement et ne pas être testée correctement. Ou la logique du programme peut dépendre du code dans le Function
.
L’exemple suivant illustre la différence entre And
, Or
, et leurs équivalents de court-circuit.
Dim amount As Integer = 12
Dim highestAllowed As Integer = 45
Dim grandTotal As Integer
If amount > highestAllowed And checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount > highestAllowed AndAlso checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
If amount < highestAllowed Or checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount < highestAllowed OrElse checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
Function checkIfValid(ByVal checkValue As Integer) As Boolean
If checkValue > 15 Then
MsgBox(CStr(checkValue) & " is not a valid value.")
' The MsgBox warning is not displayed if the call to
' checkIfValid() is part of a short-circuited expression.
Return False
Else
grandTotal += checkValue
' The grandTotal value is not updated if the call to
' checkIfValid() is part of a short-circuited expression.
Return True
End If
End Function
Dans l’exemple précédent, notez que le code important à l’intérieur de checkIfValid()
ne s’exécute pas lorsque l’appel est court-circuité. La première instruction If
appelle checkIfValid()
même si 12 > 45
renvoie False
, car And
ne court-circuite pas. La deuxième instruction If
n’appelle pas checkIfValid()
, car quand 12 > 45
renvoie False
, AndAlso
court-circuite la deuxième expression. La troisième instruction If
appelle checkIfValid()
même si 12 < 45
renvoie True
, car Or
ne court-circuite pas. La quatrième instruction If
n’appelle pas checkIfValid()
, car quand 12 < 45
renvoie True
, OrElse
court-circuite la deuxième expression.
Opérations au niveau du bit
Les opérations au niveau du bit évaluent deux valeurs intégrales sous forme binaire (base 2). Ils comparent les bits aux positions correspondantes, puis attribuent des valeurs en fonction de la comparaison. L'exemple ci-dessous illustre l’opérateur And
.
Dim x As Integer
x = 3 And 5
L’exemple précédent définit la valeur x
sur 1. Cela se produit pour les raisons suivantes :
Les valeurs sont traitées comme binaires :
3 sous forme binaire = 011
5 sous forme binaire = 101
L’opérateur
And
compare les représentations binaires, une position binaire (bit) à la fois. Si les deux bits à une position donnée sont 1, un 1 est placé dans cette position dans le résultat. Si l’un ou l’autre bit est 0, un 0 est placé dans cette position dans le résultat. Dans l’exemple précédent, cela fonctionne comme suit :011 (3 sous forme binaire)
101 (5 sous forme binaire)
001 (Le résultat, sous forme binaire)
Le résultat est traité comme décimal. La valeur 001 est la représentation binaire de 1, de sorte que
x
= 1.
L’opération Or
au niveau du bit est similaire, sauf qu’un 1 est attribué au bit de résultat si l'un ou l'autre des bits comparés, ou les deux, est égal à 1. Xor
attribue un 1 au bit de résultat si exactement l’un des bits comparés (pas les deux) est 1. Not
prend un opérande unique et inverse tous les bits, y compris le bit de signe, et attribue cette valeur au résultat. Cela signifie que pour les nombres positifs signés, Not
renvoie toujours une valeur négative et pour les nombres négatifs, Not
renvoie toujours une valeur positive ou nulle.
Les opérateurs AndAlso
et OrElse
les opérateurs ne prennent pas en charge les opérations au niveau du bit.
Notes
Les opérations au niveau du bit peuvent être effectuées uniquement sur les types intégraux. Les valeurs à virgule flottante doivent être converties en types intégraux avant que l’opération au niveau du bit puisse continuer.