Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operatory logiczne porównują Boolean
Boolean
wyrażenia i zwracają wynik. Operatory And
, Or
, AndAlso
, OrElse
i Xor
są binarne, ponieważ przyjmują dwa operandy, podczas gdy operator Not
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
. Generuje logiczne przeciwieństwo swojego operandu. Jeśli wyrażenie zostanie ocenione na True
, wtedy Not
zwraca False
; jeśli wyrażenie zostanie ocenione na False
, wtedy Not
zwraca True
. Poniższy przykład ilustruje to.
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 logiczną koniunkcję 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 którekolwiek z wyrażeń przyjmuje wartość True
, lub oba przyjmują wartość True
, wtedy Or
zwraca 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 mają wartość True
, lub oba mają wartość False
, Xor
zwraca 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.
Short-Circuiting operacje logiczne
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 zwarciowe. 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
.
Short-Circuiting Trade-Offs
Pominięcie obliczeń może poprawić wydajność, poprzez nieocenianie 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 Function
, to procedura ta nie jest wywoływana, jeśli wyrażenie zostanie skrócone, a żaden dodatkowy kod zawarty w 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 warto zauważyć, że niektóre ważne fragmenty kodu wewnątrz checkIfValid()
nie są uruchamiane, gdy wywołanie zostaje przerwane.
If
Pierwsza instrukcja wywołuje checkIfValid()
, mimo że 12 > 45
zwraca wartość False
, ponieważ And
nie przerywa realizacji. Druga If
instrukcja nie wywołuje checkIfValid()
, ponieważ gdy 12 > 45
zwraca False
, AndAlso
skraca 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()
, ponieważ gdy 12 < 45
zwraca True
, OrElse
skraca działanie drugiego wyrażenia.
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 operator And
.
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 oba bity na danej pozycji są równe 1, wówczas umieszcza się 1 na tej pozycji w wyniku. 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 logiczna Or
jest podobna, z tą różnicą, że bit 1 jest przypisany do bitu wynikowego, jeśli którykolwiek z porównywanych bitów lub oba bity wynoszą 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, że w przypadku Not
liczb dodatnich 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 / Notatka
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ą.