Operatory logiczne i bitowe w Visual Basic
Operatory logiczne porównują Boolean
Boolean
wyrażenia i zwracają wynik. Operatory And
, , Or
, OrElse
AndAlso
, i Xor
są binarne, ponieważ przyjmują dwa operandy, podczas gdy Not
operator jest jednoargumentowy, ponieważ przyjmuje pojedynczy operand. Niektóre z tych operatorów mogą również wykonywać bitowe operacje logiczne na wartości całkowitych.
Jednoargumentowy operator logiczny
Operator Not wykonuje negację logiczną na wyrażeniuBoolean
. Daje logiczne przeciwieństwo operandu. Jeśli wyrażenie zwróci wartość True
, Not
zwraca wartość , a False
jeśli wyrażenie zwróci False
wartość , Not
zwraca wartość True
. Ilustruje to poniższy przykład.
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
Operatory logiczne binarne
Operator And wykonuje logiczne połączenie na dwóch Boolean
wyrażeniach. Jeśli oba wyrażenia mają wartość True
, And
zwraca wartość True
. Jeśli co najmniej jedno z wyrażeń zwróci wartość False
, And
zwraca wartość False
.
Operator Or wykonuje logiczne rozłączenie lub dołączanie do dwóch Boolean
wyrażeń. Jeśli wyrażenie zwróci wartość , lub obie wartości są obliczane na True
True
wartość , Or
zwraca wartość True
. Jeśli żadne wyrażenie nie zwróci wartości True
, Or
zwraca wartość False
.
Operator Xor wykonuje wykluczenie logiczne na dwóch Boolean
wyrażeniach. Jeśli dokładnie jedno wyrażenie daje wartość True
, ale nie obie, Xor
zwraca wartość True
. Jeśli oba wyrażenia są obliczane na True
wartość lub oba wyrażenia mają wartość False
, Xor
zwraca wartość False
.
Poniższy przykład ilustruje operatory And
, Or
i 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.
Operacje logiczne zwarciowe
Operator AndAlso jest bardzo podobny do And
operatora, ponieważ wykonuje również logiczne połączenie na dwóch Boolean
wyrażeniach. Kluczową różnicą między nimi jest to, że AndAlso
wykazuje zachowanie zwarcie . Jeśli pierwsze wyrażenie w wyrażeniu AndAlso
daje wartość False
, drugie wyrażenie nie jest obliczane, ponieważ nie może zmienić wyniku końcowego i AndAlso
zwraca wartość False
.
Podobnie operator OrElse wykonuje zwarcie logiczne rozłączenie na dwóch Boolean
wyrażeniach. Jeśli pierwsze wyrażenie w wyrażeniu OrElse
daje wartość True
, drugie wyrażenie nie jest obliczane, ponieważ nie może zmienić wyniku końcowego i OrElse
zwraca wartość True
.
Kompromisy w obwodach zwarciowych
Zwarcie może poprawić wydajność, nie oceniając wyrażenia, które nie może zmienić wyniku operacji logicznej. Jeśli jednak to wyrażenie wykonuje dodatkowe akcje, zwarcie pomija te akcje. Jeśli na przykład wyrażenie zawiera wywołanie procedury, ta procedura nie jest wywoływana, jeśli wyrażenie jest zwarcie, a żaden dodatkowy kod zawarty w elemencie Function
Function
nie jest uruchamiany. W związku z tym funkcja może być uruchamiana tylko od czasu do czasu i może nie być prawidłowo przetestowana. Lub logika programu może zależeć od kodu w pliku Function
.
W poniższym przykładzie przedstawiono różnicę między elementami And
, Or
i ich odpowiednikami zwarciowymi.
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
W poprzednim przykładzie należy pamiętać, że niektóre ważne elementy wewnątrz checkIfValid()
nie są uruchamiane, gdy wywołanie jest zwarcie. If
Pierwsza instrukcja wywołuje checkIfValid()
metodę , mimo że 12 > 45
zwraca wartość False
, ponieważ And
nie powoduje zwarć obwodu. Druga If
instrukcja nie wywołuje checkIfValid()
metody , ponieważ gdy 12 > 45
zwraca wartość , AndAlso
zwarcie zwraca False
drugie wyrażenie. Trzecia If
instrukcja wywołuje checkIfValid()
metodę , mimo że 12 < 45
zwraca True
wartość , ponieważ Or
nie powoduje zwarć obwodu. Czwarta If
instrukcja nie wywołuje checkIfValid()
metody , ponieważ gdy 12 < 45
zwraca True
wartość , OrElse
zwarcie powoduje drugie wyrażenie.
Operacje bitowe
Operacje bitowe oceniają dwie wartości całkowite w postaci binarnej (base 2). Porównują bity w odpowiednich pozycjach, a następnie przypisują wartości na podstawie porównania. Poniższy przykład ilustruje And
operator .
Dim x As Integer
x = 3 And 5
W poprzednim przykładzie ustawiono wartość na x
1. Dzieje się tak z następujących powodów:
Wartości są traktowane jako binarne:
3 w postaci binarnej = 011
5 w postaci binarnej = 101
Operator
And
porównuje reprezentacje binarne, jedną pozycję binarną (bit) naraz. Jeśli obie bity na danej pozycji to 1, wówczas w wyniku znajduje się wartość 1. Jeśli jeden z bitów ma wartość 0, wartość 0 zostanie umieszczona w tym położeniu w wyniku. W poprzednim przykładzie działa to w następujący sposób:011 (3 w postaci binarnej)
101 (5 w postaci binarnej)
001 (wynik w postaci binarnej)
Wynik jest traktowany jako liczba dziesiętna. Wartość 001 jest reprezentacją binarną 1, więc
x
= 1.
Operacja bitowa Or
jest podobna, z tą różnicą, że bit 1 jest przypisany do bitu wynikowego, jeśli bit lub oba bity w porównaniu wynosi 1. Xor
przypisuje 1 do bitu wynikowego, jeśli dokładnie jeden z bitów porównywanych (nie obu) ma wartość 1. Not
przyjmuje pojedynczy operand i odwraca wszystkie bity, w tym bit znaku i przypisuje wartość do wyniku. Oznacza to, Not
że w przypadku cyfr dodatnich ze znakiem zawsze zwraca wartość ujemną, a w przypadku liczb Not
ujemnych zawsze zwraca wartość dodatnią lub zero.
Operatory AndAlso
i OrElse
nie obsługują operacji bitowych.
Uwaga
Operacje bitowe można wykonywać tylko na typach całkowitych. Wartości zmiennoprzecinkowe muszą być konwertowane na typy całkowite, zanim będzie można kontynuować operację bitową.