Оператор And (Visual Basic)
Выполняет логическое соединение с двумя Boolean выражениями или побитовое соединение с двумя числовыми выражениями.
Синтаксис
result = expression1 And expression2
Компоненты
result
Обязательный. Произвольное выражение типа Boolean или числового типа. Для логического сравнения result — это логическая комбинация двух Boolean значений. Для побитовых операций — это числовое значение, result представляющее побитовое соединение двух числовых битовых шаблонов.
expression1
Обязательный. Произвольное выражение типа Boolean или числового типа.
expression2
Обязательный. Произвольное выражение типа Boolean или числового типа.
Комментарии
Для логического сравнения имеет значение if и только в том случае, result если оба expression1 значения и expression2 имеют значение True . True В следующей таблице показано, как result определяется.
| Если expression1 имеет значение | И expression2 это | Значение равно result |
|---|---|---|
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
В логическом сравнении And оператор всегда вычисляет оба выражения, которые могут включать в себя вызовы процедур. Оператор AndAlso выполняет короткое замыкание, что означает, что если expression1 имеет False значение , то expression2 не вычисляется.
При применении к числовым значениям And оператор выполняет побитовое сравнение одинаково расположенных битов в двух числовых выражениях и задает соответствующий бит в в result соответствии со следующей таблицей.
| Если бит в имеет expression1 значение | И бит в expression2 является | Бит в result имеет значение |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
Так как логические и побитовые операторы имеют более низкий приоритет, чем другие арифметические и реляционные операторы, все побитовые операции должны быть заключены в круглые скобки, чтобы обеспечить точные результаты.
Типы данных
Если операнды состоят из одного Boolean выражения и одного числового выражения, Visual Basic преобразует Boolean выражение в числовое значение (–1 для True и 0 для False ) и выполняет побитовую операцию.
Для логического сравнения типом данных результата является Boolean . Для побитового сравнения результирующий тип данных является числовым типом, подходящим для типов expression1 данных и expression2 . См. таблицу «Реляционные и побитовые сравнения» в разделе Типы данных результатов операторов.
Оператор And может быть перегружен, что означает, что класс или структура могут переопределить свое поведение, если операнд имеет тип этого класса или структуры. Если код использует этот оператор для такого класса или структуры, убедитесь, что вы понимаете его переопределенное поведение. Для получения дополнительной информации см. Operator Procedures.
Пример 1
В следующем примере оператор используется And для выполнения логического соединения двух выражений. Результатом Boolean является значение, указывающее, являются ли оба выражения . True
Dim a As Integer = 10 Dim b As Integer = 8 Dim c As Integer = 6 Dim firstCheck, secondCheck As Boolean firstCheck = a > b And b > c secondCheck = b > a And b > c
В предыдущем примере приводятся результаты True и False соответственно.
Пример 2
В следующем примере оператор используется And для выполнения логического соединения с отдельными битами двух числовых выражений. Бит в результирующем шаблоне задается, если для соответствующих битов в операндах задано значение 1.
Dim a As Integer = 10 Dim b As Integer = 8 Dim c As Integer = 6 Dim firstPattern, secondPattern, thirdPattern As Integer firstPattern = (a And b) secondPattern = (a And c) thirdPattern = (b And c)
Предыдущий пример дает результаты 8, 2 и 0 соответственно.
См. также раздел
- Логические (побитовые) операторы (Visual Basic)
- Порядок применения операторов в Visual Basic
- Список операторов, сгруппированных по функциональному назначению
- Оператор AndAlso
- Логические и побитовые операторы в Visual Basic
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Логический оператор AND: &&
Логический оператор AND ( && ) возвращается true , если оба операнда являются и возвращаются true false в противном случае. Операнды неявно преобразуются в тип bool перед оценкой, а результат — тип bool . Логическое И имеет ассоциативность в направлении слева направо.
Операнды для логического оператора AND не должны иметь один и тот же тип, но они должны иметь логический, целочисленный или указательный тип. В качестве операндов часто используются реляционные выражения и выражения равенства.
Первый операнд полностью вычисляется, и все побочные эффекты завершаются до того, как оценка логического выражения AND продолжается.
Второй операнд оценивается только в том случае, если первый операнда оценивается true (ненулево). Эта оценка устраняет отсутствие необходимости в оценке второго операнда при использовании false логического выражения AND. Такое сокращенное вычисление можно использовать для предотвращения разыменования пустого указателя, как показано в следующем примере.
char *pch = 0; // . (pch) && (*pch = 'a');
Если pch имеет значение NULL (0), правая часть выражения никогда не вычисляется. Это кратковременное вычисление делает назначение с помощью указателя NULL невозможным.
Оператор ключевое слово для &&
C++ указывает and в качестве альтернативной орфографии для && . В C альтернативная орфография предоставляется в виде макроса в заголовке . В C++альтернативная орфография является ключевое слово; или эквивалентное
Пример
// expre_Logical_AND_Operator.cpp // compile with: /EHsc // Demonstrate logical AND #include using namespace std; int main() < int a = 5, b = 10, c = 15; cout b && b < c yields " b && b
Для чего используется оператор and
Логический оператор NOT перед условием обращает его, т.е. условие считается выполненным при его невыполнении. Например условие NOT A=5 считается выполненным в тех случаях когда А не равняется 5 .
Несколько условий могут объединяться с помощью логических операторов соединения AND , OR .
При использовании оператора AND для выполнения условия должны быть выполнены оба подусловия которые он соединяет. Например условие A=5 AND D>10 будет выполнено только если значение A равняется 5 и значение D превышает 10 .
При использовании оператора OR для выполнения условия достаточно выполнения одного из подусловий.
Логические операторы могут соединять несколько условий, по цепочке, при этом сначала проверяются подусловия с оператором Not , затем подусловия соединенные операторами AND и затем, соединенные операторами OR . Для изменения порядка применения логических операторов можно заключать часть выражения в скобки, при этом операторы в скобках применяются в первую очередь.
Примеры применения логических операторов
Оператор NOT
SELECT * FROM Здания WHERE NOT Улица LIKE '%Южный пер.'
Выводятся все записи в которых значение поля Здания не оканчивается строкой Южный пер. .
Оператор AND
SELECT * FROM Здания WHERE Улица='Нахимова' AND Area>500
Выводятся записи в которых значение поля Улица равняется строке Нахимова и значение поля Area превышает 500 .
Оператор OR
SELECT * FROM Здания WHERE Perimeter>100 OR Area>500
Выводятся записи в которых значение поля Perimeter превышает 100 , значение поля Area превышает 500 , либо выполняются оба условия одновременно.
Одновременно несколько логических операторов
SELECT * FROM Здания WHERE Улица='1й Южный пер.' AND [Номер дома] NOT BETWEEN 10 AND 20 OR Улица='2й Южный пер.' AND [Номер дома] BETWEEN 1 AND 10
Выводятся все записи для домов по улице 1й Южный пер. кроме домов с 10 по 20 и все записи для домов улицы 2й Южный пер. с 1 по 10.
Изменение порядка применения операторов с помощью скобок
SELECT * FROM Здания WHERE (Perimeter>100 OR Area>500) AND [Количество этажей] = 5
Выводятся все записи в который значение поля Количество этажей равно 5 и, одновременно значение поля Perimeter превышает 100 , либо значение поля Area превышает 500 .
Понимание работы логических операций and, or и not
Важно! Операторы and и or закорачивают вычисление своих операндов (т.е. используют замыкания): правый операнд вычисляется лишь в том случае, если его значение необходимо для получения истинного значения в операциях and или or . Другими словами, замыкания в логических операциях используются для запуска второй части или последующих частей логического выражения только в том случае, если это актуально!
- or - оценивает второй аргумент, только если первый равен False . Если какой либо операнд в цепочке or является истиной, немедленно возвращается результат - первое истинное значение.
- and - оценивает второй аргумент, только если первый равен True . Если в цепочке and все операнды являются истиной, результатом будет последнее значение. А если какой-либо из операндов является False , результатом будет первое ложное значение.
- not имеет более низкий приоритет, чем операторы сравнения, так not a == b интерпретируется как not (a == b) , а выражение a == not b вовсе является синтаксической ошибкой. Единственный логический оператор с одним аргументом. Он принимает один аргумент x и возвращает противоположный результат: False для истинного значения и True для ложного значения.
Операторы and и or не приводят свои результаты принудительно к значениям True или False , а возвращают один из своих операндов. Такой подход позволяет использовать эти операторы в более общих, а не только булевых операциях. Если другие операторы, прежде чем выполнить операцию, вычисляют все свои операнды, то в случае операторов and и or с их семантикой закорачивания необходимость вычисления правого операнда определяется результатом вычисления левого.
Из булевых операторов, not имеет самый высокий приоритет, а or самый низкий, так что A and not B or C эквивалентно (A and (not B)) or C . Как всегда, скобки могут быть использованы для выражения желаемого приоритета в операциях.
Логические операции, упорядоченные по приоритету выполнения:
- not x - если x ложно, то возвращается True , иначе False .
- x and y - если x ложно, то возвращается x , иначе у .
- x or y - если x ложно, то возвращается у , иначе x
Объяснение работы замыкания c оператором and :
a = 'a' b = 'b' c = 'c' >>> a and b # 'b' >>> '' and b # '' >>> a and b and c # 'c'
Пояснения к примеру выше с оператором and :
- Оператор and вычисляет значения в булевом контексте слева направо. Значения 0 , '' , [] , () , <> и None являются ложью, все остальное является истиной. Если у and оба операнда являются истиной, результатом будет последнее значение.
- Если какой-либо из операндов является ложью, результатом будет первое такое значение. В данном случает это '' - пустая строка, первое значение которое является ложью.
- Все значения являются истиной, так что в результате мы получаем последнее c .
Объяснение работы замыкания c оператором or :
a = 'a' b = 'b' >>> a or b # 'a' >>> '' or b # 'b' >>> '' or [] or <> # <> >>> def func(): . return 1 >>> a or func() # 'a'
Пояснения к примеру выше с оператором or :
- Оператор or вычисляет значения в булевом контексте слева направо. Если операнд является истиной, or немедленно возвращает результат. В данном случае a , первое истинное значение.
- or вычисляет выражение '' , которое является ложью, затем b, которое является истиной, и возвращает его значение.
- Если все значения являются ложью, or возвращает последнее.
- Обратите внимание, что or вычисляет операнды до тех пор, пока не найдет истинное значение, остальное игнорируется. Это имеет значение, когда вычисление операнда дает сторонние эффекты. В данном случае функция func() не вызывается, так как для получения результата выражения с оператором or достаточно того, что первый операнд a является истиной.
Другие примеры с and и or :
>>> a = 'one' >>> b = 'two' >>> 1 and a or b # 'one' >>> 0 and a or b # 'two' >>> a = '' >>> b = 'two' # 'a' - пустая строка, которую Python считает ложью, # следовательно 1 and '' дает '', а '' or 'two' дает 'two'. >>> 1 and a or b # 'two'
Практическое использование замыканий and и or в кодовой базе.
Внимание! Замыкания в операциях and и or можно использовать с пользой в вычислениях для экономии ресурсов, сокращения времени выполнения и т.д., только будьте осторожны! Необходимо четко понимать как работают замыкания в операторах and и or .
- Экономия ресурсов и времени выполнения при помощи and ;
- Проверка предварительных условий перед выражением;
- Определение значения по умолчанию при помощи or ;
- Пример использования замыканий в функциях all() и any() .
Экономия ресурсов и времени выполнения при помощи and .
Рассмотрим реальный пример из модуля base64 стандартной библиотеки Python, который использует замыкание в оператора if . Исследуем функцию b64decode , которая берет строку (или объект, подобный байтам) и декодирует ее:
# взято из Lib/base64.py def b64decode(s, altchars=None, validate=False): """Decode the Base64 encoded bytes-like object or ASCII string s. [docstring cut for brevity] """ s = _bytes_from_decode_data(s) if altchars is not None: altchars = _bytes_from_decode_data(altchars) assert len(altchars) == 2, repr(altchars) s = s.translate(bytes.maketrans(altchars, b'+/')) # использование замыкания с оператором `and` if validate and not re.fullmatch(b'[A-Za-z0-9+/]*=', s): raise binascii.Error('Non-base64 digit found') return binascii.a2b_base64(s)
Смотрим на оператор if , который помечен комментарием. В условии сначала проверяется аргумент validate , а только потом результат работы функции re.fullmatch() . Аргумент validate сообщает функции, хочет ли пользователь вообще проверять строку, которую нужно декодировать. Обратите внимание, что если validate=False то сопоставление регулярного выражения не запускается (срабатывает замыкание). Если порядок операндов поменять, то результат остался такой же, но было бы потрачено гораздо больше времени.
Проверка предварительных условий перед выражением.
Другой типичный шаблон использования замыканий проявляется, когда перед определенной операцией, которая может вызвать исключение, нужно что-то проверить.
Допустим есть последовательность и нужно взять элемент по индексу, но последовательность может оказаться пустой или ее длина может быть меньше индекса. Например:
>>> lst = [0, 1, 2] >>> lst[3] # Traceback (most recent call last): # File "", line 1, in # IndexError: list index out of range
Используем проверку предварительных условий:
>>> lst = [0, 1, 2] >>> if lst and len(lst) >=3: . lst[3]
Здесь, в условии сначала проверяется что список НЕ пустой и только после этого вычисляется длинна этого списка. Если список пустой, то его длина проверяться не будет и условие if завершиться.
Еще один пример из модуля enum :
# взято из Lib/enum.py def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, start=1): """ Convenience method to create a new Enum class. """ # [сокращено для краткости] # special processing needed for names? if isinstance(names, str): names = names.replace(',', ' ').split() # смотрим на следующие условие if isinstance(names, (tuple, list)) and names and isinstance(names[0], str): original_names, names = names, [] last_values = [] # [сокращено для краткости]
Более длинный оператор if содержит три выражения, разделенных операторами and , и первые два выражения нужны для того, чтобы убедиться, можно ли безопасно выполнить последнее.
- isinstance(names, (tuple, list)) - проверяет, является ли names кортежем или списком. Если не является то условие завершается.
- далее names проверяется пусто оно или нет. Если элементов нет то условие завершается.
- если names не пустой, то можно безопасно выполнить последнюю проверку, связанную с индексацией names[0] , а именно isinstance(names[0], str) .
Определение значения по умолчанию при помощи or .
Замыкание с помощью логического оператора or может использоваться для присвоения переменным значений по умолчанию. Вот пример:
# test.py greet = input("Ваше имя >> ") or "незнакомец" print(f"Привет, greet>!") # $python3 -i test.py # Ваше имя >> # Привет, незнакомец!
Если запустить этот пример и ничего не вводя нажать Enter, то получим вывод "Привет, незнакомец!". Что тут происходит? Если ничего не вводить и нажать Enter, то функция input() вернет пустую строку '' , что является False . Следовательно, оператор or видит ложное значение слева и должен оценить правый операнд. Для определения окончательное значение выражения or оценивает правый операнд и если он True , то возвращает его значение.
Еще пример присвоения значение по умолчанию (используя or ) для изменяемого аргумента из стандартной библиотеки Python.
# взято из Lib/cgitb.py class Hook: """A hook to replace sys.excepthook that shows tracebacks in HTML.""" def __init__(self, display=1, logdir=None, context=5, file=None, format="html"): self.display = display # send tracebacks to browser if true self.logdir = logdir # log tracebacks to files if not None self.context = context # number of source code lines per frame self.file = file or sys.stdout # self.format = format
Этот код взят из модуля cgitb и определяет sys.stdout как значение по умолчанию для переменной self.file . Определение функции __init__ имеет file=None в качестве ключевого аргумента, так почему бы просто не написать file=sys.stdout ?
Проблема в том, что sys.stdout может быть изменяемым объектом, поэтому использование file=sys.stdout в качестве ключевого аргумента со значением по умолчанию не будет работать так, как ожидается. Это легче продемонстрировать со списком в качестве аргумента по умолчанию, хотя принцип тот же:
>>> def addend(val, l=[]): . l.append(val) . print(l) >>> addend(3, [1, 2]) # [1, 2, 3] >>> addend(5) # [5] >>> addend(5) # [5, 5] >>> addend(5) # [5, 5, 5]
Обратите внимание на три последовательных вызова addend(5) . Ожидается, что вызов addend(5) со значением по умолчанию l=[] будет вести себя одинаково, но т.к. список является изменяемым объектом, то вызовы добавляют значения val к значению по умолчанию [] , при этом список растет! Дополнительно смотрите материал "Список Python как аргумент по умолчанию".
Пример использования замыканий or и and в функциях all() и any() .
Если в выражении генератора использовать оператор моржа := , и принимать во внимание тот факт, что функции all() и any() также используют замыкания, то можно использовать следующую конструкцию для извлечения первого истинного элемента.
any(predicate(witness := item) for item in items)
Другими словами, если какой-либо элемент item удовлетворяет условию в функции predicate() , то переменная witness сохранит его значение!
Например, если последовательность содержит много целых чисел, как выяснить, есть ли там какие-либо нечетные числа, и как вывести первое из них?
items = [14, 16, 18, 20, 35, 41, 100] any_found = False for item in items: any_found = item % 2 if any_found: print(f"Найдено нечетное число item>.") break
Теперь все это сравним со следующим кодом:
>>> items = [14, 16, 18, 20, 35, 41, 100] >>> is_odd = lambda x: x % 2 >>> if any(is_odd(witness := item) for item in items): . print(f"Найдено нечетное число witness>.") # Найдено нечетное число 35.