Dela via


Logiska operatorer och bitvis-operatorer i Visual Basic

Logiska operatorer jämför Boolean uttryck och returnerar ett Boolean resultat. Operatorerna And, Or, AndAlso, OrElseoch Xor är binära eftersom de tar två operander, medan operatorn Not är oföränderlig eftersom den tar en enda operand. Vissa av dessa operatorer kan också utföra bitvis logiska åtgärder på integralvärden.

Unary logisk operatör

Operatorn Inte utför logisk negation för ett Boolean uttryck. Det ger den logiska motsatsen till dess operand. Om uttrycket utvärderas till True, returnerar NotFalse; om uttrycket utvärderas till False, returnerar NotTrue. I följande exempel visas detta.

Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.

Binära logiska operatorer

Operatorn Och utför logisk konjunktion på två Boolean uttryck. Om båda uttrycken utvärderas till True, då returneras And av True. Om minst ett av uttrycken utvärderas till FalseAnd returneras False.

Operatorn Eller utför logisk disjunction eller inkludering i två Boolean uttryck. Om något av uttrycken utvärderas som True, eller båda utvärderas som True, returnerar OrTrue. Om inget av uttrycken utvärderas till True returnerar OrFalse.

Xor-operatorn utför logisk exkludering i två Boolean uttryck. Om exakt ett uttryck utvärderas till True, men inte båda, Xor returnerar True. Om båda uttrycken utvärderas till True eller båda utvärderas till Falsereturneras XorFalse.

I följande exempel visas operatorerna And, Oroch 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.

Short-Circuiting logiska åtgärder

AndAlso-operatorn är mycket lik operatornAnd, eftersom den också utför logisk konjunktion på två Boolean uttryck. Den viktigaste skillnaden mellan de två är att AndAlso uppvisar kortslutningsbeteende . Om det första uttrycket i ett AndAlso uttryck utvärderas till Falseutvärderas inte det andra uttrycket eftersom det inte kan ändra slutresultatet och AndAlso returnerar False.

På samma sätt utför OrElse-operatorn kortslutande logisk disjunction på två Boolean uttryck. Om det första uttrycket i ett OrElse uttryck utvärderas till Trueutvärderas inte det andra uttrycket eftersom det inte kan ändra slutresultatet och OrElse returnerar True.

Short-Circuiting Trade-Offs

Kortslutning kan förbättra prestanda genom att inte utvärdera ett uttryck som inte kan ändra resultatet av den logiska åtgärden. Men om uttrycket utför ytterligare åtgärder, så hoppar genvägslogik över dessa åtgärder. Om uttrycket till exempel innehåller ett anrop till en Function procedur anropas inte proceduren om uttrycket är kortslutet och eventuell ytterligare kod som ingår i Function körs inte. Därför kan funktionen bara köras ibland och kanske inte testas korrekt. Eller så kan programlogik bero på koden i Function.

I följande exempel visas skillnaden mellan And, Oroch deras kortslutningsmotsvarigheter.

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

Observera i föregående exempel att viss viktig kod inuti checkIfValid() inte körs när anropet är kortslutet. Den första If instruktionen anropar checkIfValid() även om 12 > 45 returnerar False, eftersom And inte kortsluter. Den andra If instruktionen anropar inte checkIfValid(), eftersom när 12 > 45 returnerar False, AndAlso kortsluter det andra uttrycket. Den tredje If instruktionen anropar checkIfValid() även om 12 < 45 returnerar True, eftersom Or inte kortsluter. Den fjärde If-satsen anropar inte checkIfValid(), eftersom 12 < 45 returnerar True och OrElse gör att det andra uttrycket kortsluts.

Bitvis åtgärder

Bitvis-åtgärder utvärderar två integralvärden i binärt (bas 2)-formulär. De jämför bitarna vid motsvarande positioner och tilldelar sedan värden baserat på jämförelsen. I följande exempel visas operatorn And .

Dim x As Integer
x = 3 And 5

I föregående exempel anges värdet x till 1. Detta händer av följande skäl:

  • Värdena behandlas som binära:

    3 i binär form = 011

    5 i binär form = 101

  • Operatorn And jämför binära representationer, en binär position (bit) i taget. Om båda bitarna vid en given position är 1 placeras en 1 i den positionen i resultatet. Om endera biten är 0 placeras en 0 i den positionen i resultatet. I föregående exempel fungerar detta på följande sätt:

    011 (3 i binär form)

    101 (5 i binär form)

    001 (Resultatet, i binär form)

  • Resultatet behandlas som decimaltecken. Värdet 001 är den binära representationen av 1, så x = 1.

Bitvisåtgärden Or är liknande, förutom att en 1 tilldelas till resultatbiten om endera eller båda av de jämförda bitarna är 1. Xor tilldelar en 1 till resultatbiten om exakt en av de jämförda bitarna (inte båda) är 1. Not tar en enda operand och inverterar alla bitar, inklusive teckenbiten, och tilldelar resultatet det värdet. Det innebär att för signerade positiva tal Not returnerar alltid ett negativt värde och för negativa tal Not returnerar alltid ett positivt eller nollvärde.

Operatorerna AndAlso och OrElse stöder inte bitvis åtgärder.

Anmärkning

Bitvis åtgärder kan endast utföras på integraltyper. Flyttalsvärden måste konverteras till heltalstyper innan bitvisa operationer kan fortsätta.

Se även