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, Xorrestituisce 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.

Vedi anche