Перейти к содержимому

bool

Тема: bool, flow control.

Видео:

  • Логические значения (true, false)
  • Логические выражения
  • Операторы сравнения чисел >, <, >=, <=, ==, !=
  • Логические операторы &&, ||, ==, !, !=
  • Lazy evaluation операндов операторов && и ||
  • Неявное преобразование в bool из int и указателей
  • Макро NULL
  • Особое значение nullptr
bool a { true };
std::cout << a << std::endl;
Ответ

Тип bool принимает только два значения: true и false.
При выводе в консоль, напечатается 1 для true и 0 для false.

bool a { 0 };
bool b { 1 };
Ответ

Вместо false можно также сохранить 0, а вместо true можно сохранить 1. Это с успехом компилируется.

bool c { static_cast<bool>(123) };
Ответ

static_cast<bool> для int дает true, если число не 0, иначе false. В c будет true.

std::cout << sizeof(bool) << std::endl;
Ответ

bool занимает 1 байт, несмотря на то, что для представления 2-х значений, 0 или 1, достаточно всего одного бита. Если хотите, сохранить несколько bool значений в отдельные биты в один и тот же байт, необходимо использовать побитовые маски.

bool a = 1 == 2;
std::cout << a << std::endl;
Ответ

Оператор == применяется к 2 выражениям и возвращает результат проверки на равенство, как логическое значение. Результат false.

int x = 3;
int y = 4;
bool b = x == y;
std::cout << b << std::endl;
Ответ

Здесь, оператор работает не с числами напрямую, а со значениями переменных. При выполнении, вместо x как бы вставится значение из x (как с выражениями), и так далее.

int x = 3;
int y = 4;
bool b = x == y;
x = 4;
std::cout << b << std::endl;
Ответ

В b сохраняется не выражение x == y, а результат его вычисления (false). Последующее изменение x никак не воздействует на b.

int x = 3;
int y = 4;
bool b = x * 2 == y + 4;
std::cout << b << std::endl;
Ответ

Пример использования более сложных выражений как операнд.

bool b = x * 2 == y + 4 воспринимается как bool b = ((x * 2) == (y + 4)). Дальше вычисления происходят согласно правилам выражений.

bool a = 1 > 2;
a = 3 == 3;
std::cout << a << std::endl;
Ответ

Здесь, a перезапишется с false на другое значение (true).

#include <iostream>
void f(bool a)
{
std::cout << a << std::endl;
}
int main()
{
bool a = true;
f(a);
}
#include <iostream>
void f(bool flag)
{
std::cout << flag << std::endl;
}
int main()
{
f(5 > 3);
}
Ответ

Аргумент 5 > 3 вычисляется перед вызовом функции.
В flag попадет результат true.

#include <iostream>
void f(bool b)
{
b = true;
}
int main()
{
int x { 1 };
f(x == 2);
std::cout << x << std::endl;
}
Ответ

При вызове f ей передается результат вычисления выражения x == 2. Изменение переменной параметра b никак не повлияет на x.

Выведется 1.

#include <iostream>
bool f()
{
return true;
}
int main()
{
bool result = f();
std::cout << result << std::endl;
}
#include <iostream>
bool IsGreater(int a, int b)
{
return a > b;
}
int main()
{
bool result = IsGreater(5, 6);
std::cout << result << std::endl;
}
bool a = true;
bool b = false;
bool c = a == b;
std::cout << c << std::endl;
Ответ

Оператор равенства == можно применять к выражениям типа bool. Сравнение true == false даёт false.

bool a = false;
bool b = !a;
std::cout << b << std::endl;
Ответ

Оператор ! делает из false true (и наоборот).

bool a = true;
bool b = false;
bool c = a && b;
std::cout << c << std::endl;
Ответ

a && b -> true && false -> false, потому что оба операнда должны быть true.

#include <iostream>
bool A()
{
std::cout << "A" << std::endl;
return true;
}
bool B()
{
std::cout << "B" << std::endl;
return true;
}
int main()
{
}
Ответ

Определение функций A и B лишь описывает, что произошло бы при их вызове. Поскольку main не вызывает ни одной из функций, их тела никогда не выполнятся, поэтому ничего не напечатается.

#include <iostream>
bool A()
{
std::cout << "A" << std::endl;
return true;
}
bool B()
{
std::cout << "B" << std::endl;
return true;
}
int main()
{
bool result = A() && B();
}
Ответ

Для того, чтобы удостоверится, что A() и B() оба вернут true, программе необходимо их обоих вызвать.

A
B
#include <iostream>
bool A()
{
std::cout << "A" << std::endl;
return true;
}
bool B()
{
std::cout << "B" << std::endl;
return false;
}
int main()
{
bool result = A() && B();
}
Ответ

Первая функция возвращает true, поэтому вторая тоже выполняется.
Вторая вернет false, и результат выражения будет A() && B() -> true && false -> false.

A
B
#include <iostream>
bool A()
{
std::cout << "A" << std::endl;
return false;
}
bool B()
{
std::cout << "B" << std::endl;
return true;
}
int main()
{
bool result = A() && B();
}
Ответ

При &&, если первый операнд false, второй не вычисляется.
Это называется lazy evaluation (ленивое вычисление).

A
#include <iostream>
bool A()
{
std::cout << "A" << std::endl;
return true;
}
bool B()
{
std::cout << "B" << std::endl;
return true;
}
int main()
{
bool result = A() || B();
}
Ответ

При ||, если первый операнд true, второй не вычисляется.
Это тоже ленивое вычисление.

A

23. Функция перезаписывает переменную из выражения параметра

Заголовок раздела «23. Функция перезаписывает переменную из выражения параметра»
#include <iostream>
void func(bool b, int* a)
{
std::cout << b << std::endl;
*a = 2;
std::cout << b << std::endl;
}
int main()
{
int a { 1 };
func(a == 1, &a);
}
Ответ

В func передастся результат вычисления выражения a == 1, а также адрес a.

Изменяя a, func не изменит и b, потому что информация о том, из какого выражения произошло значение для b теперь была потеряна. В b сохраняется только результат!