Operatory logiczne i bitowe w Visual Basic

Operatory logiczne porównują BooleanBoolean wyrażenia i zwracają wynik. Operatory And, , Or, OrElseAndAlso, i Xorbinarne, 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 Falsejeśli wyrażenie zwróci Falsewartość , 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 TrueTruewartość , 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, Ori 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 FunctionFunction 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, Ori 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 Falsedrugie wyrażenie. Trzecia If instrukcja wywołuje checkIfValid() metodę , mimo że 12 < 45 zwraca Truewartość , ponieważ Or nie powoduje zwarć obwodu. Czwarta If instrukcja nie wywołuje checkIfValid()metody , ponieważ gdy 12 < 45 zwraca Truewartość , 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ą.

Zobacz też