Operatori logici e bit per bit in Visual Basic
Gli operatori logici confrontano le espressioni Boolean
e restituiscono un risultato Boolean
. Gli operatori And
, Or
, AndAlso
, OrElse
e Xor
sono binari perché accettano due operandi, mentre l'operatore Not
è unario perché accetta un singolo operando. Alcuni di questi operatori possono anche eseguire operazioni logiche bit per bit su valori integrali.
Operatore logico unario
L'operatore Not applica la negazione logica in un'espressione Boolean
. Restituisce l'opposto logico del suo operando. Se l'espressione restituisce True
, Not
restituisce False
. Se l'espressione restituisce False
, Not
restituisce True
. Ciò è illustrato nell'esempio seguente.
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
Operatori logici binari
L'operatore And applica una congiunzione logica in due espressioni Boolean
. Se entrambe le espressioni restituiscono True
, And
restituisce True
. Se almeno una delle espressioni restituisce False
, And
restituisce False
.
L'operatore Or applica la disgiunzione o l'inclusione logica in due espressioni Boolean
. Se una delle due espressioni restituisce True
o entrambi restituiscono True
, Or
restituisce True
. Se nessuna delle due espressioni restituisce True
, Or
restituisce False
.
L'operatore Xor applica l'esclusione logica in due espressioni Boolean
. Se solo un'espressione, ma non entrambe, restituisce True
, Xor
restituisce True
. Se entrambe le espressioni restituiscono True
o False
, Xor
restituisce False
.
Nell'esempio seguente vengono illustrati gli operatori And
, Or
e 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.
Corto circuito di operazioni logiche
L'operatore AndAlso è molto simile all'operatore And
, in quanto applica anch'esso la congiunzione logica in due espressioni Boolean
. La differenza principale tra i due è che AndAlso
presenta un comportamento di corto circuito. Se la prima espressione in un'espressione AndAlso
restituisce False
, la seconda espressione non viene valutata perché non può modificare il risultato finale e AndAlso
restituisce False
.
Analogamente, l'operatore OrElse applica il corto circuito della disgiunzione logica in due espressioni Boolean
. Se la prima espressione in un'espressione OrElse
restituisce True
, la seconda espressione non viene valutata perché non può modificare il risultato finale e OrElse
restituisce True
.
Compromessi del corto circuito
Il corto circuito può migliorare le prestazioni in quanto non valuta un'espressione che non può modificare il risultato dell'operazione logica. Tuttavia, se tale espressione esegue azioni aggiuntive, con il corto circuito tali azioni vengono ignorate. Ad esempio, se l'espressione include una chiamata a una routine Function
, tale routine non viene chiamata in caso di corto circuito dell'espressione e il codice aggiuntivo contenuto in Function
non viene eseguito. Pertanto, la funzione potrebbe essere eseguita solo occasionalmente e non essere testata correttamente. È anche possibile che la logica del programma dipenda dal codice in Function
.
Nell'esempio seguente viene illustrata la differenza tra And
, Or
e le relative controparti con corto circuito.
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
Nell'esempio precedente si noti che codice importante all'interno di checkIfValid()
non viene eseguito in caso di corto circuito della chiamata. La prima istruzione If
chiama checkIfValid()
anche se 12 > 45
restituisceFalse
, perché non si verifica un corto circuito in And
. La seconda istruzione If
non chiama checkIfValid()
, perché quando 12 > 45
restituisce False
, AndAlso
applica il corto circuito sulla seconda espressione. La terza istruzione If
chiama checkIfValid()
anche se 12 < 45
restituisce True
, perché Or
non applica il corto circuito. La quarta istruzione If
non chiama checkIfValid()
, perché quando 12 < 45
restituisce True
, OrElse
applica il corto circuito sulla seconda espressione.
Operazioni bit per bit
Le operazioni bit per bit valutano due valori integrali in formato binario (base 2). Confrontano i bit nelle posizioni corrispondenti e quindi assegnano valori in base al confronto. Nell'esempio seguente viene illustrato l'operatore And
.
Dim x As Integer
x = 3 And 5
Nell'esempio precedente il valore di x
viene impostato su 1. Questo si verifica per i motivi seguenti:
I valori vengono considerati come binari:
3 in formato binario = 011
5 in formato binario = 101
L'operatore
And
confronta le rappresentazioni binarie, una posizione binaria (bit) alla volta. Se entrambi i bit in una determinata posizione sono 1, viene inserito un valore 1 in tale posizione nel risultato. Se uno dei due bit è 0, viene inserito un valore 0 in tale posizione nel risultato. Nell'esempio precedente il risultato è il seguente:011 (3 in formato binario)
101 (5 in formato binario)
001 (risultato in formato binario)
Il risultato viene considerato come decimale. Il valore 001 è la rappresentazione binaria di 1, quindi
x
= 1.
L'operazione bit per bit Or
è simile, ad eccezione del fatto che il valore 1 viene assegnato al bit del risultato se uno o entrambi i bit confrontati sono 1. Xor
assegna un valore 1 al bit del risultato se esattamente uno dei bit confrontati (non entrambi) è 1. Not
accetta un singolo operando e inverte tutti i bit, incluso il bit più significativo, e assegna tale valore al risultato. Questo significa che per i numeri positivi con segno Not
restituisce sempre un valore negativo e per i numeri negativi Not
restituisce sempre un valore positivo o zero.
Gli operatori AndAlso
e OrElse
non supportano operazioni bit per bit.
Nota
Le operazioni bit per bit possono essere eseguite solo sui tipi integrali. I valori a virgola mobile devono essere convertiti in tipi integrali prima di poter eseguire l'operazione bit per bit.