Operatori logici e bit per bit in Visual Basic
Gli operatori logici confrontano Boolean
le espressioni e restituiscono un Boolean
risultato. Gli And
operatori , Or
, OrElse
AndAlso
, 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 sui valori integrali.
Operatore logico unario
L'operatore Not esegue la negazione logica in un'espressioneBoolean
. Restituisce l'opposto logico del suo operando. Se l'espressione restituisce True
, Not
restituisce False
; se l'espressione False
restituisce , Not
restituisce True
. Questa condizione è illustrata 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 esegue una combinazione logica su due Boolean
espressioni. Se entrambe le espressioni valutano True
, restituisce And
True
. Se almeno una delle espressioni restituisce , And
restituisce .False
False
L'operatore Or esegue la disgiunzione logica o l'inclusione in due Boolean
espressioni. Se un'espressione restituisce , o entrambi restituisce True
Or
True
True
. Se nessuna espressione restituisce , Or
restituisce True
False
.
L'operatore Xor esegue l'esclusione logica su due Boolean
espressioni. Se un'espressione restituisce True
esattamente , ma non entrambe, Xor
restituisce True
. Se entrambe le espressioni valutano o entrambe valutano True
False
, Xor
restituisce False
.
Nell'esempio seguente vengono illustrati gli And
operatori , 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.
operazioni logiche Short-Circuiting
L'operatore AndAlso è molto simile all'operatoreAnd
, in quanto esegue anche una combinazione logica su due Boolean
espressioni. La differenza chiave tra i due è che AndAlso
mostra il 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 esegue la disgiunzione logica a corto circuito su due Boolean
espressioni. 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
.
Short-Circuiting Trade-Offs
Il corto circuito può migliorare le prestazioni non valutando un'espressione che non può modificare il risultato dell'operazione logica. Tuttavia, se tale espressione esegue azioni aggiuntive, il corto circuito ignora tali azioni. Ad esempio, se l'espressione include una chiamata a una Function
routine, tale procedura non viene chiamata se l'espressione è corto circuito e qualsiasi codice aggiuntivo contenuto nell'oggetto Function
non viene eseguito. Pertanto, la funzione potrebbe essere eseguita solo occasionalmente e potrebbe non essere testata correttamente. In alternativa, la logica del programma può dipendere dal codice in Function
.
Nell'esempio seguente viene illustrata la differenza tra And
, Or
e le relative controparti a 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 alcuni codici importanti all'interno checkIfValid()
non vengono eseguiti quando la chiamata è a corto circuito. La prima If
istruzione chiama checkIfValid()
anche se 12 > 45
restituisce False
, perché And
non è corto circuito. La seconda If
istruzione non chiama checkIfValid()
, perché quando 12 > 45
restituisce False
, AndAlso
short-circuits la seconda espressione. La terza If
istruzione chiama checkIfValid()
anche se 12 < 45
restituisce True
, perché Or
non è corto circuito. La quarta If
istruzione non chiama checkIfValid()
, perché quando 12 < 45
restituisce True
, OrElse
short-circuits la seconda espressione.
Operazioni bit per bit
Le operazioni bit per bit valutano due valori integrali nel formato binario (base 2). Confrontano i bit in 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
L'esempio precedente imposta il valore di x
su 1. Ciò accade per i motivi seguenti:
I valori vengono considerati 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, un 1 viene posizionato in tale posizione nel risultato. Se entrambi i bit sono 0, un 0 viene posizionato in tale posizione nel risultato. Nell'esempio precedente questa operazione viene eseguita come indicato di seguito: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 Or
bit è simile, ad eccezione del fatto che un 1 viene assegnato al bit di risultato se uno o entrambi i bit confrontati sono 1. Xor
assegna un bit a 1 al risultato se esattamente uno dei bit confrontati (non entrambi) è 1. Not
accetta un singolo operando e inverte tutti i bit, incluso il bit di segno, e assegna tale valore al risultato. Ciò significa che per i numeri positivi firmati, Not
restituisce sempre un valore negativo e per i numeri negativi, Not
restituisce sempre un valore positivo o zero.
Gli AndAlso
operatori 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 che l'operazione bit per bit possa procedere.
Vedi anche
Commenti e suggerimenti
Invia e visualizza il feedback per