Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Logické operátory porovnávají Boolean
výrazy a vrací Boolean
výsledek. Operátory And
, Or
, AndAlso
, OrElse
a Xor
jsou binární, protože mají dva operandy, zatímco Not
operátor je unární, protože má 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
True
. Následující příklad to ilustruje.
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 pokud se oba vyhodnotí jako True
, pak Or
vrátí True
. Pokud se ani jeden výraz nevyhodnotí na True
, Or
vrátí 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 operátory And
, Or
a 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 logické operace
Operátor AndAlso je velmi podobný operátoruAnd
, 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í krátkozáporné logické disjunkce pro dvě Boolean
výrazy. 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
.
Short-Circuiting Trade-Offs
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 se neprovede, pokud se vyhodnocení výrazu ukončí předčasně, a žádný další kód obsažený v Function
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 krátko-spojovacími 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 důležitý kód uvnitř checkIfValid()
se nespustí, když je volání vynecháno. 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
zkratuje 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
zkrátí vyhodnocování druhého výrazu.
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 operátor And
.
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 kterýkoli bit 0, pak se do této pozice ve výsledku umístí 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á, kromě toho, že do výsledku je přiřazena 1, pokud je jeden nebo oba porovnávané bity 1.
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
a OrElse
nepodporují 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 před tím, než mohou být provedeny bitové operace.