| Оператор | Смысл |
|---|---|
И | логическое И — истина, только если оба операнда истинны |
ИЛИ | логическое ИЛИ — истина, если хотя бы один операнд истинен |
НЕ | инверсия — НЕ Истина = Ложь |
Если Цена > 0 И Количество > 0 Тогда ...
Если Статус = "Новый" ИЛИ Статус = "ВРаботе" Тогда ...
Если НЕ ЗначениеЗаполнено(Комментарий) Тогда ...Сокращённое вычисление (short-circuit)
Платформа вычисляет логическое выражение только до того места, где результат уже однозначно ясен и не может измениться от оставшейся части — как &&/|| в C-подобных языках:
- у
И— если первый операндЛожь, весь результат ужеЛожь, второй операнд не вычисляется; - у
ИЛИ— если первый операндИстина, весь результат ужеИстина, второй операнд не вычисляется.
Именно поэтому классическая проверка-предохранитель работает безопасно одной строкой:
// безопасно: если Ссылка = Неопределено, до Ссылка.Свойство дело не доходит —
// первый операнд уже сделал И ложным целиком
Если Ссылка <> Неопределено И Ссылка.Свойство = Истина Тогда ...
КонецЕсли;Порядок операндов при этом важен — проверка-предохранитель должна идти первой. Переставленное условие вычисляется в обычном порядке слева направо, и без короткого замыкания на первом операнде опасное обращение всё равно случится раньше:
// опасно: порядок операндов обратный — Ссылка.Свойство вычисляется первым,
// до того, как выяснится, что Ссылка вообще Неопределено
Если Ссылка.Свойство = Истина И Ссылка <> Неопределено Тогда ...Аналогично для ИЛИ — предохранитель, отсекающий опасный случай, ставится первым операндом.
В отличие от ?()
Короткое замыкание есть только у И/ИЛИ как у операторов — у ?() его нет, это обычная функция, и оба её значения-аргумента вычисляются всегда, независимо от условия. Одну и ту же проверку-предохранитель через И писать безопасно, а через ?() — нет.