Знакомство с логическими операторами и операциями стоит начать с отведённого для этого логического типа 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.

Эта публикация содержит только часть статьи.

Полные уроки по C++, реверс-инжинирингу и разработке софта вы можете найти тут: