Megosztás a következőn keresztül:


Logikai és bitenkénti operátorok a Visual Basicben

A logikai operátorok összehasonlítják Boolean a kifejezéseket, és eredményt adnak vissza Boolean . A And, Or, AndAlso, OrElse és Xor operátorok binárisak, mert két operandust vesznek fel, míg az Not operátor unáris, mert egyetlen operandusra van szükség. Ezen operátorok némelyike bitenkénti logikai műveleteket is végrehajthat az integrálértékeken.

Unary logikai operátor

A Nem operátor logikai tagadást hajt végre egy Boolean kifejezésen. Az operandus logikai ellentétét adja. Ha a kifejezés értéke True, akkor Not visszaadja False; ha a kifejezés értéke False, akkor Not visszaadja True. Az alábbi példa ezt szemlélteti.

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áris logikai operátorok

Az And Operátor két kifejezésen végez logikai Boolean. Ha mindkét kifejezés kiértékelése True, akkor And visszaadja True. Ha a kifejezések közül legalább egy kiértékelődik False, akkor And visszaadja False értéket.

Az Or operátor logikai tiltást vagy belefoglalást hajt végre két Boolean kifejezésen. Ha bármelyik kifejezés eredménye True, vagy mindkettő eredménye True, akkor Or visszaadja a True értéket. Ha egyik kifejezés sem értékel True értéket, akkor Or visszaadja False.

Az Xor operátor két kifejezésen végez logikai Boolean. Ha pontosan egy kifejezés kiértékelése True, de nem mindkettő, Xor akkor a függvény eredménye True. Ha mindkét kifejezés True-ra, vagy mindkettő False-re értékelődik ki, akkor a Xor visszaadja False-t.

Az alábbi példa a And, Or és Xor operátorokat szemlélteti.

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 logikai műveletek

Az AndAlso operátor nagyon hasonlít az And operátorra, mivel két Boolean kifejezésen is logikai kötőszót hajt végre. A legfontosabb különbség a kettő között az, hogy AndAlsorövidzárlatos viselkedést mutat. Ha az első kifejezés egy AndAlso kifejezésben False értékelésre kerül, akkor a második kifejezés nem kerül kiértékelésre, mert nem befolyásolhatja a végső eredményt, és AndAlso visszaadja False.

Hasonlóképpen, az OrElse operátor két Boolean kifejezésen rövidzárlatú logikai disjunctiont hajt végre. Ha az első kifejezés egy OrElse kifejezésben True értékelésre kerül, akkor a második kifejezés nem kerül kiértékelésre, mert nem befolyásolhatja a végső eredményt, és OrElse visszaadja True.

Short-Circuiting Trade-Offs

A rövidzárolás javíthatja a teljesítményt, ha nem értékel ki olyan kifejezést, amely nem tudja módosítani a logikai művelet eredményét. Ha azonban ez a kifejezés további műveleteket hajt végre, a rövidzárolás kihagyja ezeket a műveleteket. Ha például a kifejezés tartalmaz egy eljáráshívástFunction, a rendszer nem hívja meg az eljárást, ha a kifejezés rövidzárlatú, és a további kód nem fut.Function Ezért előfordulhat, hogy a függvény csak alkalmanként fut, és nem megfelelően van tesztelve. Vagy a program-logika a Function kódtól függhet.

Az alábbi példa szemlélteti a And, a Or és a rövidzárlatú társaik közötti különbséget.

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

Az előző példában vegye figyelembe, hogy a checkIfValid()-ben lévő néhány fontos kód nem fut le, amikor a hívás leáll. Az első If utasítás akkor is meghívja checkIfValid(), amikor 12 > 45 visszatér False, mert And nem rövidzárlatot okoz. A második If utasítás nem hívja meg checkIfValid(), mert amikor 12 > 45 visszatér False-val, akkor AndAlso rövidre zárja a második kifejezést. A harmadik If utasítás meghívja a checkIfValid()-t, még akkor is, ha 12 < 45 visszatér True, mert a Or nem rövidzár (nem rövidzár tartalmaz). A negyedik If utasítás nem hívja meg checkIfValid(), mert amikor 12 < 45 visszatér True értékkel, OrElse rövidre zárja a második kifejezést.

Bitenkénti műveletek

A Bitwise-műveletek két integrálértéket értékelnek ki bináris (2. alap) formában. Összehasonlítják a biteket a megfelelő pozíciókban, majd az összehasonlítás alapján értékeket rendelnek hozzá. Az alábbi példa az operátort szemlélteti And .

Dim x As Integer
x = 3 And 5

Az előző példa x értékét 1-re állítja be. Ez a következő okokból történik:

  • Az értékek binárisként vannak kezelve:

    3 bináris formában = 011

    5 bináris formában = 101

  • Az And operátor egyszerre egy bináris pozíciót (bitet) hasonlít össze a bináris reprezentációkkal. Ha egy adott pozíció mindkét bitje egyforma és értéke 1, akkor az eredményben egy 1 kerül az adott pozícióba. Ha bármelyik bit 0, akkor a 0 a helyére kerül az eredményben. Az előző példában ez a következőképpen működik:

    011 (3 bináris formában)

    101 (5 bináris formában)

    001 (Az eredmény bináris formában)

  • Az eredmény decimálisként lesz kezelve. A 001 érték az 1 bináris ábrázolása, tehát x = 1.

A bitenkénti Or művelet hasonló, azzal a kivételrel, hogy az eredménybithez egy 1 van rendelve, ha az összehasonlított bitek vagy mindkettő 1. Xor 1-et rendel az eredménybithez, ha az összehasonlított bitek (nem mindkettő) egyike 1. Not egyetlen operandust vesz fel, és az összes bitet invertálta, beleértve a jelbitet is, és hozzárendeli ezt az értéket az eredményhez. Ez azt jelenti, Not hogy az aláírt pozitív számok esetében mindig negatív értéket ad vissza, a negatív számok Not esetében pedig mindig pozitív vagy nulla értéket ad vissza.

Az AndAlso és OrElse az operátorok nem támogatják a bitenkénti műveleteket.

Megjegyzés:

Bitenkénti műveletek csak integrál típusok esetében hajtható végre. A lebegőpontos értékeket a bitenkénti művelet folytatása előtt integráltípusokká kell konvertálni.

Lásd még