Знакомство с логическими операторами и операциями стоит начать с отведённого для этого логического типа bool.
Он хранит состояние истина или ложь - true или false соответственно.
int main() {
bool a = false;
std::cout << a << std::endl;
}
0
По умолчанию поток вывода отображает значения bool как 0 и 1.
При включении std::boolalpha используются текстовые значения true и false.
bool a = true;
std::cout << std::boolalpha;
std::cout << a << std::endl;
true
Но в памяти эти значения всё равно являются числами 1 и 0 в большинстве случаев, как правило, в 1 байте, согласно ABI используемого компилятора.
Интересно, что булевы литералы true или false могут быть неявно преобразованы в тип int и наоборот.
int a = false;
std::cout << a << std::endl;
0
Только во втором случае есть неочевидная особенность для отрицательных значений.
bool a = 0;
bool b = 1;
bool c = 2;
bool d = -1;
std::cout << a << std::endl; // 0
std::cout << b << std::endl; // 1
std::cout << c << std::endl; // 1
std::cout << d << std::endl; // 1
Во всех случаях, кроме 0 при приведении числа к типу bool вы получите единицу.
Оператор логического "И"
Оператор && является бинарным оператором, то есть выполняющимся для двух операндов, например
int main() {
bool a = true;
bool b = false;
bool result = a && b;
std::cout << result << std::endl; // 0
}
Можно выводить без использования результирующей переменной
std::cout << a && b << std::endl;
mismatch in formal parameter list
'<<': unable to resolve function overload
cannot determine which instance of function template "std::endl" is intended
Компилятор точно не понимает что мы хотим от него в этом случае, потому что оператор << имеет больший приоритет чем &&.
И выражение воспринимается вот так:
(std::cout << a) && (b << std::endl);
Чтобы избежать ошибок необходимо поставить это выражение в круглые скобки, тем самым определив порядок
std::cout << (a && b) << std::endl;
Этот результат выполнения операции && будет истиной только в том случае, если оба операнда (левый И правый) истинны.
Можно наглядно это увидеть, если вывести все четыре варианта развития событий
Оформите подписку, чтобы иметь доступ ко всем публикациям без ограничений. Вы получите мгновенный доступ к полным версиям материалов, исходному коду и новым публикациям сразу после их выхода.
Я регулярно публикую материал и разборы ситуаций для различных игр, движков, а так же подходов разработки включая Internal, External и DMA.