bool
Тема: bool, flow control.
Видео:
Концепты
Заголовок раздела «Концепты»- Логические значения (
true,false) - Логические выражения
- Операторы сравнения чисел
>,<,>=,<=,==,!= - Логические операторы
&&,||,==,!,!= - Lazy evaluation операндов операторов
&&и|| - Неявное преобразование в
boolизintи указателей - Макро
NULL - Особое значение
nullptr
Примеры на понимание
Заголовок раздела «Примеры на понимание»1. true
Заголовок раздела «1. true»bool a { true };std::cout << a << std::endl;Ответ
Тип bool принимает только два значения: true и false.
При выводе в консоль, напечатается 1 для true и 0 для false.
2. 0 и 1 как bool
Заголовок раздела «2. 0 и 1 как bool»bool a { 0 };bool b { 1 };Ответ
Вместо false можно также сохранить 0, а вместо true можно сохранить 1.
Это с успехом компилируется.
3. Конверсия int в bool
Заголовок раздела «3. Конверсия int в bool»bool c { static_cast<bool>(123) };Ответ
static_cast<bool> для int дает true, если число не 0, иначе false.
В c будет true.
4. Размер bool
Заголовок раздела «4. Размер bool»std::cout << sizeof(bool) << std::endl;Ответ
bool занимает 1 байт, несмотря на то, что для представления 2-х значений,
0 или 1, достаточно всего одного бита.
Если хотите, сохранить несколько bool значений в отдельные биты
в один и тот же байт, необходимо использовать побитовые маски.
5. bool выражение (1)
Заголовок раздела «5. bool выражение (1)»bool a = 1 == 2;std::cout << a << std::endl;Ответ
Оператор == применяется к 2 выражениям и возвращает результат проверки на равенство, как логическое значение.
Результат false.
6. bool выражение (2)
Заголовок раздела «6. bool выражение (2)»int x = 3;int y = 4;bool b = x == y;std::cout << b << std::endl;Ответ
Здесь, оператор работает не с числами напрямую, а со значениями переменных.
При выполнении, вместо x как бы вставится значение из x (как с выражениями), и так далее.
7. bool выражение (3)
Заголовок раздела «7. bool выражение (3)»int x = 3;int y = 4;bool b = x == y;x = 4;std::cout << b << std::endl;Ответ
В b сохраняется не выражение x == y, а результат его вычисления (false).
Последующее изменение x никак не воздействует на b.
8. bool выражение (4)
Заголовок раздела «8. bool выражение (4)»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)).
Дальше вычисления происходят согласно правилам выражений.
9. Перезапись bool переменной
Заголовок раздела «9. Перезапись bool переменной»bool a = 1 > 2;a = 3 == 3;std::cout << a << std::endl;Ответ
Здесь, a перезапишется с false на другое значение (true).
10. Функция с bool параметром из переменной
Заголовок раздела «10. Функция с bool параметром из переменной»#include <iostream>
void f(bool a){ std::cout << a << std::endl;}
int main(){ bool a = true; f(a);}11. Функция с bool параметром из выражения
Заголовок раздела «11. Функция с bool параметром из выражения»#include <iostream>
void f(bool flag){ std::cout << flag << std::endl;}
int main(){ f(5 > 3);}Ответ
Аргумент 5 > 3 вычисляется перед вызовом функции.
В flag попадет результат true.
12. Функция перезаписывающая bool параметр
Заголовок раздела «12. Функция перезаписывающая bool параметр»#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.
13. bool return
Заголовок раздела «13. bool return»#include <iostream>
bool f(){ return true;}
int main(){ bool result = f(); std::cout << result << std::endl;}14. Пример логической функции
Заголовок раздела «14. Пример логической функции»#include <iostream>
bool IsGreater(int a, int b){ return a > b;}
int main(){ bool result = IsGreater(5, 6); std::cout << result << std::endl;}15. Сравнение логических переменных
Заголовок раздела «15. Сравнение логических переменных»bool a = true;bool b = false;bool c = a == b;std::cout << c << std::endl;Ответ
Оператор равенства == можно применять к выражениям типа bool.
Сравнение true == false даёт false.
16. Оператор !
Заголовок раздела «16. Оператор !»bool a = false;bool b = !a;std::cout << b << std::endl;Ответ
Оператор ! делает из false true (и наоборот).
17. Оператор &&
Заголовок раздела «17. Оператор &&»bool a = true;bool b = false;bool c = a && b;std::cout << c << std::endl;Ответ
a && b -> true && false -> false, потому что оба операнда должны быть true.
18. Функции, которые никогда не вызываются
Заголовок раздела «18. Функции, которые никогда не вызываются»#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 не вызывает ни одной из функций, их тела никогда не выполнятся,
поэтому ничего не напечатается.
19. Тонкости оператора && (1)
Заголовок раздела «19. Тонкости оператора && (1)»#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, программе необходимо их обоих вызвать.
AB20. Тонкости оператора && (2)
Заголовок раздела «20. Тонкости оператора && (2)»#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.
AB21. Тонкости оператора && (3)
Заголовок раздела «21. Тонкости оператора && (3)»#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 (ленивое вычисление).
A22. Тонкости оператора && (4)
Заголовок раздела «22. Тонкости оператора && (4)»#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, второй не вычисляется.
Это тоже ленивое вычисление.
A23. Функция перезаписывает переменную из выражения параметра
Заголовок раздела «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 сохраняется только результат!