Logické a bitové operátory v jazyce Visual Basic
Logické operátory porovnávají Boolean
výrazy a vrací Boolean
výsledek. Operátory And
, , OrElse
Or
AndAlso
a jsou Xor
binární, protože mají dva operandy, zatímco Not
operátor je unární, protože trvá jeden operand. Některé z těchto operátorů můžou také provádět bitové logické operace s celočíselnými hodnotami.
Unární logický operátor
Operátor Not provádí logickou negaci u výrazuBoolean
. Dává logický opak svého operandu. Pokud se výraz vyhodnotí jako True
, vrátí Not
; False
pokud se výraz vyhodnotí jako False
, vrátí Not
hodnotu True
. Toto dokládá následující příklad.
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ární logické operátory
Operátor And provádí logické spojení se dvěma Boolean
výrazy. Pokud se oba výrazy vyhodnotí jako True
, vrátí And
hodnotu True
. Pokud se alespoň jeden z výrazů vyhodnotí jako False
, vrátí And
hodnotu False
.
Operátor Or provádí logickou disjunkci nebo zahrnutí u dvou Boolean
výrazů. Pokud se některý z výrazů vyhodnotí jako True
, nebo oba vyhodnotí na True
hodnotu , Or
vrátí hodnotu True
. Pokud se výraz nevyhodnotí jako True
výraz , Or
vrátí hodnotu False
.
Operátor Xor provádí logické vyloučení dvou Boolean
výrazů. Pokud se přesně jeden výraz vyhodnotí jako True
, ale ne obojí, Xor
vrátí hodnotu True
. Pokud se oba výrazy vyhodnotí jako True
nebo obě vyhodnotí jako False
, Xor
vrátí hodnotu False
.
Následující příklad znázorňuje , Or
a Xor
operátoryAnd
.
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.
Logické operace s zkratováním
Operátor AndAlso je velmi podobný operátoru And
, protože také provádí logické spojení se dvěma Boolean
výrazy. Klíčovým rozdílem mezi těmito dvěma je, že AndAlso
vykazuje zkratové chování. Pokud se první výraz ve výrazu AndAlso
vyhodnotí jako False
, druhý výraz se nevyhodnotí, protože nemůže změnit konečný výsledek a AndAlso
vrátí False
.
Podobně operátor OrElse provádí zkratové logické disjunkce na dvou Boolean
výrazech. Pokud se první výraz ve výrazu OrElse
vyhodnotí jako True
, druhý výraz se nevyhodnotí, protože nemůže změnit konečný výsledek a OrElse
vrátí True
.
Kompromisy pro zkratové obvody
Zkratování může zlepšit výkon tím, že nevyhodnocuje výraz, který nemůže změnit výsledek logické operace. Pokud ale tento výraz provede další akce, přeskočí tyto akce zkratování. Pokud například výraz obsahuje volání Function
procedury, tato procedura není volána, pokud je výraz zkrácený a žádný další kód obsažený v Function
tomto postupu se nespustí. Proto může funkce běžet jen občas a nemusí být správně testována. Nebo logika programu může záviset na kódu v souboru Function
.
Následující příklad ukazuje rozdíl mezi And
, Or
a jejich zkratové protějšky.
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
V předchozím příkladu si všimněte, že některé důležité kódy uvnitř checkIfValid()
se nespustí, když je volání zkratované. První If
příkaz volá checkIfValid()
, i když 12 > 45
vrací False
, protože And
nemá zkrat. Druhý If
příkaz nevolá checkIfValid()
, protože když 12 > 45
vrátí False
, AndAlso
zkratové obvody druhý výraz. Třetí If
příkaz volá checkIfValid()
, i když 12 < 45
vrací True
, protože Or
nemá zkrat. Čtvrtý If
příkaz nevolá checkIfValid()
, protože když 12 < 45
vrátí , True
OrElse
zkratové obvody druhý výraz.
Bitové operace
Bitové operace vyhodnocují dvě integrální hodnoty v binární podobě (základ 2). Porovnávají bity na odpovídajících pozicích a pak přiřazují hodnoty na základě porovnání. Následující příklad znázorňuje And
operátor.
Dim x As Integer
x = 3 And 5
Předchozí příklad nastaví hodnotu x
na hodnotu 1. K tomu dochází z následujících důvodů:
Hodnoty jsou považovány za binární:
3 v binární podobě = 011
5 v binární podobě = 101
Operátor
And
porovnává binární reprezentace, jednu binární pozici (bit) najednou. Pokud jsou oba bity na dané pozici 1, umístí se do této pozice ve výsledku 1. Pokud je některý bit 0, umístí se do této pozice ve výsledku 0. V předchozím příkladu to funguje takto:011 (3 v binární podobě)
101 (5 v binární podobě)
001 (výsledek v binární podobě)
Výsledek se považuje za desítkové. Hodnota 001 je binární reprezentace 1, takže
x
= 1.
Bitová Or
operace je podobná s tím rozdílem, že výsledek je přiřazen 1, pokud je 1 nebo oba porovnávané bity. Xor
přiřadí k výslednému bitu hodnotu 1, pokud je přesně jedna z porovnávaných bitů (ne obojí) 1. Not
vezme jeden operand a invertuje všechny bity, včetně znaménka, a přiřadí danou hodnotu výsledku. To znamená, že u podepsaných kladných čísel vždy Not
vrátí zápornou hodnotu a pro záporná čísla Not
vždy vrátí kladnou nebo nulovou hodnotu.
Operátory AndAlso
nepodporují OrElse
bitové operace.
Poznámka:
Bitové operace lze provádět pouze na celočíselných typech. Hodnoty s plovoucí desetinou čárkou musí být převedeny na celočíselné typy, aby mohly pokračovat bitové operace.