Логические и побитовые операторы в Visual Basic
Логические операторы сравнивают Boolean
выражения и возвращают Boolean
результат. Операторы , , OrElse
и операторы являются двоичными, потому что они принимают два операнда, в то время Not
как оператор является унарным, потому что он принимает один операнду.Xor
AndAlso
Or
And
Некоторые из этих операторов также могут выполнять побитовые логические операции со целыми значениями.
Унарный логический оператор
Оператор Not выполняет логическое отрицание выражения Boolean
. Он дает логическую противоположность его операнда. Если выражение вычисляется, возвращаетсяFalse
; если выражение вычисляетсяFalse
, возвращается.Not
True
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.
Короткие логические операции
Оператор 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
принимает один операнд и инвертирует все биты, включая бит знака, и назначает это значение результату. Это означает, что для подписанных положительных чисел всегда возвращает отрицательное значение, а для отрицательных Not
Not
чисел всегда возвращает положительное или нулевое значение.
OrElse
Операторы AndAlso
не поддерживают побитовые операции.
Примечание.
Побитовые операции можно выполнять только для целочисленных типов. Значения с плавающей запятой необходимо преобразовать в целочисленные типы, прежде чем побитовая операция может продолжиться.