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 operator

Operatorn Inte utför logisk negation för ett Boolean uttryck. Det ger den logiska motsatsen till sin operand. Om uttrycket utvärderas till Truereturneras False. Om uttrycket utvärderas till FalseNot returneras True.Not 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 TrueAnd returneras 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 till True, eller båda utvärderas till True, Or returneras True. Om inget av uttrycken utvärderas till TrueOr returnerar .False

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.

Kortslutna 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.

Kompromisser för kortslutning

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 hoppar kortslutning ö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 checkIfValid()inte , 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 instruktionen anropar checkIfValid()inte , eftersom när 12 < 45 returnerar True, OrElse kortsluter det andra uttrycket.

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 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 invertera alla bitar, inklusive teckenbiten, och tilldelar det värdet till resultatet. 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.

Kommentar

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

Se även