Поделиться через


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

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

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

Оператор Not выполняет логическое отрицание выражения 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 выполняет логическую комбинацию двух Boolean выражений. Если оба выражения оцениваются в True, то And возвращает True. Если хотя бы одно из выражений вычисляется в False, то And возвращает False.

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

Оператор Xor выполняет логическое исключение для двух 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.

логические операции Short-Circuiting

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

Аналогичным образом оператор OrElse выполняет короткое замыкание логического дисъюнкции на двух Boolean выражениях. Если первое выражение в выражении OrElse вычисляется в True, то второе выражение не вычисляется, поскольку оно не может изменить окончательный результат, и OrElse возвращает True.

Short-Circuiting Trade-Offs

Короткое замыкание может повысить производительность, не оценивая выражение, которое не может изменить результат логической операции. Однако если это выражение выполняет дополнительные действия, механизм короткого замыкания пропускает эти действия. Например, если выражение включает вызов 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 прерывает выполнение второго выражения.

Побитовые операции

Побитовые операции оценивают два целочисленных значения в двоичной форме (base 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 не поддерживают побитовые операции.

Замечание

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

См. также