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

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

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

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

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, возвращается AndTrue. Если по крайней мере одно из выражений вычисляется False, возвращается AndFalse.

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

Короткие логические операции

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

Аналогичным образом оператор OrElse выполняет короткое замыкание логического дисъюнкции на двух 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 возвращается, так как And не замыкаетсяFalse. Вторая If инструкция не вызывается checkIfValid(), так как при 12 > 45 возврате Falseкороткие AndAlso замыкания второго выражения. Третья If инструкция вызываетсяcheckIfValid(), даже если 12 < 45 возвращается, так как Or не замыкаетсяTrue. Четвертая 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 принимает один операнд и инвертирует все биты, включая бит знака, и назначает это значение результату. Это означает, что для подписанных положительных чисел всегда возвращает отрицательное значение, а для отрицательных NotNot чисел всегда возвращает положительное или нулевое значение.

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

Примечание.

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

См. также