В программировании есть отдельный тип выражений - логические, они выполняются с логическими величинами - величины, которые могут иметь только два значения: 0 и 1 или константы false
(0, ложь) и true
(1, правда). Выражения составляются при помощи специальных логических операторов. Результат выполнения любого логического оператора - логическая величина.
Для программы ключевое слово true
это 1
, а false
это 0
, и их можно равноценно друг на друга заменять. Зачем тогда их придумали, если можно использовать 1 и 0 и получить более короткую запись? Эти обозначения нужны в первую очередь для удобства программиста, чтобы в большой программе сориентироваться по типам данных, т.к. true
и false
принято присваивать только к логическим переменным. Например, если в коде встретится var = 0
- то var
может быть любым численным типом данных, а если var = false
- то мы сразу понимаем, что это логика, что помогает быстрее сориентироваться в чужом и своём коде.
Тип bool #
Для хранения логических величин можно использовать логический тип данных - bool
:
bool b = true;
b = 0;
Операторы #
И #
Логическая операция И возвращает результат true
, когда обе величины имеют значение true
, дословно одна И вторая. Иногда её называют логическим умножением, так как результат по сути совпадает с обычным математическим умножением:
A | B | A и B |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
Операция выполняется при помощи оператора &&
или and
:
bool b = true && false;
// b равно false
bool b0 = 1, b1 = 1;
bool bb = b0 and b1;
// bb равно true
ИЛИ #
Логическая операция ИЛИ возвращает результат true
, хотя бы одна из величин имеет значение true
, дословно одна ИЛИ вторая. Иногда её называют логическим сложением, так как результат по сути совпадает с обычным математическим сложением:
A | B | A или B |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
Операция выполняется при помощи оператора ||
или or
:
bool b = true || false;
// b равно true
bool b0 = 0, b1 = 0;
bool bb = b0 or b1;
// bb равно false
НЕ #
Логическая операция НЕ просто инвертирует величину на противоположную. Выполняется при помощи оператора !
или not
:
bool b = !true;
// b равно false
bool bb = not b;
// bb равно true
Выражения #
Составные выражения #
Можно записать несколько выражений подряд, они будут вычисляться попарно слева направо, причём операция И имеет приоритет над ИЛИ:
b = false && true || true;
b = true || false && true;
// b равно true в обоих случаях
// сначала выполнится false && true - false
// затем false || true - true
Чтобы точно не запутаться в приоритетах, рекомендуется ставить логические скобки.
Скобки #
Можно использовать круглые скобки для разделения выражений - логические скобки. Они будут работать по математическим правилам - сначала выполняется выражение в скобках:
// прошлый пример по сути вычисляется вот так:
bool b = (false && true) || true;
// а если поставить скобки здесь - получится false
b = false && (true || true);
// получим true
b = !(false && (true || true));
Однозначный результат #
Операторы логического И и ИЛИ в C++ ведут себя "лениво": во время вычисления процессор может остановиться и вернуть результат, не вычисляя и не выполняя остальные выражения, если будет однозначно уверен в результате. Это происходит с логическим ИЛИ, если первое выражение имеет результат true
, или с логическим И, если первый результат - false
:
b = true || выражение; // true
b = false && выражение; // false
Результат будет получен независимо от значения выражение
, поэтому процессор пропускает его вычисление для оптимизации быстродействия. Здесь играет роль именно порядок выражений, знание этой особенности помогает писать более эффективный и быстрый код. А незнание может приводить к ошибкам - например нам нужен результат ИЛИ выполнения двух функций:
b = foo() || bar();
b = foo() && bar();
Если foo()
вернёт true
в первом случае или false
во втором, то функция bar()
даже не будет вызвана! Если по логике работы программы эта функция должна быть вызвана - это может привести к непредсказуемому поведению.