Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Логические операторы сравнивают 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
не поддерживают побитовые операции.
Замечание
Побитовые операции можно выполнять только для целочисленных типов. Значения с плавающей запятой необходимо преобразовать в целочисленные типы, прежде чем побитовая операция может продолжиться.