Логические операции

Логические операции производят вычисления над операндами логического типа и возвращают результат того же типа.

П

Символы

Описание

Пример

А

2

!

Логическое НЕ

!e1

R

11

&&

Логическое И

e1 && e2

L

12

||

Логическое ИЛИ

e1 || e2

L

Логическое НЕ обращает true в false, а false — в true.

Логическое И равно true, если оба операнда равны true.

Логическое ИЛИ равно true, если хотя бы один операнд равен true.

Операторы И и ИЛИ всегда вычисляют операнды слева направо и по возможности применяют сокращение вычислений. Если левый операнд равен false, то оператор И пропускает второй операнд, потому что он ни на что не влияет — результат уже точно равен false. Если левый операнд равен true, то оператор ИЛИ пропускает второй операнд по аналогичной причине, так как результат в любом случае будет равен true.

Это часто используется в программах для предотвращения ошибок во втором операнде (и последующих операндах). Например, мы можем обезопасить себя от ошибки обращения к несуществующему элементу массива:

index < ArraySize(array) && array[index] != 0

Здесь используется встроенная функция ArraySize, возвращающая длину массива. Только в том случае, если index меньше длины, происходит чтение элемента с этим индексом и его сравнение с нулем.

Обратная по смыслу проверка с помощью '||' также применяется, например:

ArraySize(array) == 0 || array[0] == 0

Условие сразу выполнится, если массив пуст. И только если есть элементы, продолжится дополнительная проверка на содержимое.

Когда выражение состоит из множества операндов, объединенных логическим ИЛИ, то по первому true (если такое найдется) будет сразу получен общий результат true. Когда же операнды объединены логическим И, то по первому false будет сразу получен общий результат false.

Разумеется, можно комбинировать разные операции в одном выражении, учитывая при этом их разный приоритет: отрицание выполняется прежде всего, затем — условия по И, и в конце — условия по ИЛИ. Если требуется другая последовательность, необходимо её явно указывать с помощью скобок.

Например, следующее выражение без скобок — A && B || C && D — фактически эквивалентно: (A && B) || (C && D). Чтобы логическое ИЛИ выполнялось первым, нужно заключить его в скобки: A && (B || C) && D. Более подробно об использовании скобок см. раздел Группировка с помощью круглых скобок.

В скрипте ExprLogical.mq5 приведены простые примеры для проверки логических операций на практике.

int x = 3y = 4z = 5;
bool expr1 = x == y && z > 0;  // false, x != y, z не важно
bool expr2 = x != y && z > 0;  // true,  оба условия соблюдены
bool expr3 = x == y || z > 0;  // true,  достаточно того, что z > 0
bool expr4 = !x;               // false, x должен быть 0, чтобы получить true
bool expr5 = x > 0 && y > 0 && z > 0// true, все 3 выполнены
bool expr6 = x < 0 || y > 0 && z > 0// true, y и z достаточно
bool expr7 = x < 0 || y < 0 || z > 0// true, z достаточно

В строке с вычислением expr6 компилятор выдает предупреждение "проверьте приоритеты, возможна ошибка; используйте скобки для уточнения" ("check operator precedence for possible error; use parentheses to clarify precedence").

Не следует путать логические операции '&&' и '||' с побитовыми операциями '&' и '|' (рассматриваются в следующем разделе).