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 nem számít, 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 kiértékelése True
, majd Not
eredménye False
; ha a kifejezés kiértékelése így történik False
, akkor Not
visszaadja a függvényt 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 Boolean
kifejezésen végez logikai kötőszót. Ha mindkét kifejezés kiértékelésre kerül True
, akkor And
visszaadja a függvényt True
. Ha a kifejezések közül legalább egy kiértékelésre kerül False
, akkor And
a visszaadott False
értéket adja vissza.
Az Or operátor logikai tiltást vagy belefoglalást hajt végre két Boolean
kifejezésen. Ha bármelyik kifejezés kiértékeli a True
értéket, vagy mindkettő kiértékeli azt True
, akkor Or
a visszaadott értéket True
adja vissza. Ha egyik kifejezés sem értékeli ki a függvényt True
, Or
akkor a visszaadott False
értéket adja vissza.
Az Xor operátor két Boolean
kifejezésen végez logikai kizárást. 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 kiértékelésre kerül True
, vagy mindkettő a függvényre van kiértékelve False
, Xor
a visszaadott False
értéket adja vissza.
Az alábbi példa a , Or
és Xor
operátorokat And
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.
Rövidzárolású 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 AndAlso
rövidzárlatos viselkedést mutat. Ha egy kifejezés első kifejezése AndAlso
kiértékelésre False
kerül, akkor a második kifejezés nem lesz kiértékelve, mert nem módosíthatja a végeredmé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 egy kifejezés első kifejezése OrElse
kiértékelésre True
kerül, akkor a második kifejezés nem lesz kiértékelve, mert nem módosíthatja a végeredményt, és OrElse
visszaadja True
.
Rövidzárlatú kereskedelmi ügyletek
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 programlogika függhet a kódtól a Function
.
Az alábbi példa a , Or
és rövidzárlatú társaik közötti And
különbséget szemlélteti.
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 néhány fontos kód nem checkIfValid()
fut, ha a hívás rövidzárlatú. Az első If
utasítás a visszatérés False
ellenére 12 > 45
is hívcheckIfValid()
, mert And
nem rövidzárlat. A második If
utasítás nem hívja meg checkIfValid()
a függvénytFalse
AndAlso
, mert a visszatéréskor 12 > 45
a második kifejezés rövidre van adva. A harmadik If
utasítás a visszatérés True
ellenére 12 < 45
is hívcheckIfValid()
, mert Or
nem rövidzárlatot tartalmaz. A negyedik If
utasítás nem hívja megcheckIfValid()
, mert a visszatéréskor True
12 < 45
OrElse
a második kifejezés rövidre van adva.
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 1 értéket x
állít 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 1, akkor az eredményben egy 1 lesz az adott pozícióban. 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.
Feljegyzé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.