Sdílet prostřednictvím


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, 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í NotFalse; pokud se výraz vyhodnotí jako False, vrátí NotTrue. 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.

Viz také