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, , OrElseOrAndAlsoa jsou Xorbiná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 ; Falsepokud 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 Truehodnotu , Or vrátí hodnotu True. Pokud se výraz nevyhodnotí jako Truevý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 , Ora 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, Ora 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í , TrueOrElse 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.

Viz také