Логические и побитовые операторы в Visual Basic

Логические операторы сравнивают Boolean выражения и возвращают Boolean результат. Операторы And, Or, AndAlso, OrElse и Xor являются бинарными , так как они принимают два операнда, а оператор Not является унарным, поскольку он принимает один операнд. Некоторые из этих операторов могут также выполнять побитовые логические операции над целыми значениями.

Унарный логический оператор

Оператор Not (Visual Basic) выполняет логическое отрицание выражения Boolean. Он возвращает логическую противоположность своего операнда. Если выражение True, то Not возвращает False; если выражение False, то Not возвращает True. Это показано в приведенном ниже примере.

Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.

Бинарные логические операторы

Оператор And (Visual Basic) выполняет логическое умножение двух Boolean выражений. Если оба выражения True, то And возвращает True. Если хотя бы одно из выражений False, то And возвращает False.

Оператор Or (Visual Basic) выполняет логическое сложение или импликацию двух Boolean выражений. Если выражение True или оба выражения True, то Or возвращает True. Если ни одно выражение не True, то Or возвращает False.

Оператор Xor (Visual Basic) выполняет логическое исключение двух Boolean выражений. Если точно одно выражение True, но не оба, то Xor возвращает True. Если оба выражения True или оба False, то Xor возвращает False.

В следующем примере показано использование операторов And, Or и 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.

Логические операторы сокращенного вычисления

Оператор AndAlso (Visual Basic) похож на оператор And в том, что он также выполняет логическое умножение двух Boolean выражений. Ключевое различие между ними состоит в том, что AndAlso выполняет сокращенную обработку. Если первое выражение AndAlso равно False, то второе выражение не вычисляется, поскольку оно не повлияет на конечный результат, и AndAlso возвращает False.

Подобным образом Оператор OrElse (Visual Basic) выполняет сокращенное логическое сложение для двух Boolean выражений. Если первое выражение OrElse равно True, то второе выражение не вычисляется, поскольку оно не повлияет на конечный результат, и OrElse возвращает True.

Соглашения сокращенных вычислений

Сокращенные вычисления могут повысить производительность за счет не вычисления выражений, которые не влияют на результаты логической операции. Однако, если выражение выполняет дополнительные действия, то сокращенные вычисления пропускают эти действия. Например, если выражение содержит вызов процедуры Function, то эта процедура не вызывается при сокращенном вычислении, и любой дополнительный код, содержащийся в Function, не выполняется. Следовательно, функция может выполняться только иногда и правильно тестировать ее невозможно, или же логика программы может зависеть от кода в Function.

Следующий пример иллюстрирует разницу между And, Or и их сокращенными аналогами.

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

В предыдущем примере следует отметить, что некоторые важные коды внутри checkIfValid() не выполняются при сокращенном вызове. Первая инструкция If вызывает checkIfValid(), хотя 12 > 45 принимает значение False, так как используется не сокращенный оператор And. Вторая инструкция If не вызывает checkIfValid(), так как 12 > 45 принимает значение False, и AndAlso игнорирует второе выражение. Третья инструкция If вызывает checkIfValid(), хотя 12 < 45 принимает значение True, так как используется не сокращенный оператор Or. Четвертая инструкция If не вызывает checkIfValid(), так как 12 < 45 возвращает значение True, и OrElse игнорирует второе выражение.

Поразрядные операции

При поразрядных операциях используются два целых значения в двоичной форме (по основанию 2). Они вычисляются по битам в соответствующих позициях, и значение базируется на сравнении. В следующем примере демонстрируется оператор And.

Dim x As Integer
x = 3 And 5

В предыдущем примере для свойства x задается значение 1. Это связано со следующими причинами:

  • Значения рассматриваются как двоичные:

    3 в двоичной форме = 011

    5 в двоичной форме = 101

  • Оператор And вычисляет двоичное представление, используя одну двоичную позицию (бит) один раз. Если оба бита данной позиции равны 1, то в результат помещается 1 на эту позицию. Если любой из разрядов равен 0, то в результат помещается 0 на эту позицию. В предыдущем примере это происходит следующим образом:

    011 в двоичной форме = 3

    101 в двоичной форме = 5

    001 (Результат в двоичной форме)

  • Результат рассматривается как десятичное число. Значение 001 является двоичным представлением 1, поэтому x = 1.

Операция побитового Or аналогична за тем исключением, что результирующему биту присваивается 1, если оба сравниваемых бита равны 1. При выполнении операции Xor результирующему биту присваивается 1, только если ровно один из сравниваемых битов (а не оба) равен 1. Not принимает один операнд и инвертирует все биты, включая знаковый бит, и присваивает это значение результату. Это означает, что для положительных чисел со знаком Not всегда возвращает отрицательное значение, а для отрицательных чисел Not всегда возвращает положительное или нулевое значение.

Операторы AndAlso и OrElse не поддерживают побитовые операции.

Примечание

Поразрядные операции выполняются только над целыми типами.Значения с плавающей запятой необходимо преобразовать в целые типы перед переходом к поразрядной операции.

См. также

Ссылки

Логические (побитовые) операторы (Visual Basic)

Основные понятия

Логические выражения (Visual Basic)

Арифметические операторы в Visual Basic

Операторы сравнения в Visual Basic

Операторы объединения в Visual Basic

Эффективное сочетание операторов (Visual Basic)