View Categories

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

В программировании есть отдельный тип выражений - логические, они выполняются с логическими величинами - величины, которые могут иметь только два значения: 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() даже не будет вызвана! Если по логике работы программы эта функция должна быть вызвана - это может привести к непредсказуемому поведению.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх