Несъмнено това е най – простия тип данни в езика. Булевия тип има две стойности true и false. Декларира се с bool. Използва се за вземане на решения в конструкцията if() else. Както и в циклите с пред и пост условие – do и while. Също участва и в цикъла for.
true означава вярно, истина;
false означава невярно, лъжа;
// деклариране
bool isReady = false; // 0
bool finish = true; // 1Технически булевия тип е еднобайтово число. То приема стойност 0 за false и 1 за true. В същото време е и аритметичен тип. Това му позволява да участва в изрази.
#include <iostream>
using namespace std;
int main() {
int x = 41 + true;
int y = 42 - true;
int z = 42 + false;
cout << x << endl; // 42
cout << y << endl; // 41
cout << z << endl; // 42
}Горното няма особен смисъл. Присъства само за илюстрация. Но каква стойност ще получи една булева променлива при присвояване. Когато от дясната страна стои друга променлива или израз, които не са булеви? Вие какво мислите?
#include <iostream>
using namespace std;
int main() {
bool d = 3.14;
bool c = 'x'; // type char
bool s1 = ""; // empty c - style string
bool s2 = " "; // non empty c - style string, space
bool s3 = "Battlestar Galactica";
bool d2 = 0.0 + 0.0;
bool i = 0 + 0;
bool c1 = 0x00;
// Такова смесване на текстови низве с числа обикновено е
// абсолютно забранено! Но явно работи. Защото всичко се
// каства до bool.
bool x = s3 + d * 42;
cout << d << endl; // 1
cout << c << endl; // 1
cout << s1 << endl; // 1
cout << s2 << endl; // 1
cout << s3 << endl; // 1
cout << x << endl; // 1
cout << d2 << endl; // 0
cout << i << endl; // 0
cout << c1 << endl; // 0
}Какво ни показва горния код?
Тази програма е обратната на предходния пример. Тя ни показва, че резултата от изчисляването на израз или стойността на променлива се каства (преобразува) до булев тип.
Като всичко различно от 0 се приема за true. И само това, което е 0 се приема за false.
Ето защо само d2, i и c1 връщат false. Те реално са 0.
Променливата c, съдържа буквата ‘x’, тя има в ASCII таблицата стойност по голяма от 0. Следователно се приема за true.
s1, s2 и s3 са реално указатели към непразни масиви от тип char в стила на езика C. s2 и s3 не са празни, това е очевидно. Но ние сме посочили s1 като празен текстов низ? Но в C, както и в C++ няма смисъл да декларираме празен масив. Реално s1 не е празен. А съдържа един единствен елемент със стойност ‘\0’. Тоест 0 (нула) в ASCII код. Това е начина по който езика C показва края на текстов низ. Ако го нямаше програмата ще ви покаже „segmetation fault“ и ще спре аварийно. Това е част от наследството. Желанието да се работа на ниско и високо ниво в C++. И желанието на C++ да е език за всичко и за всички. И да подържа всички парадигми.
Следователно ето защо s1, s2 и s3 връщат true.
Какво можем да правим с bool?
Булевия тип го ползваме основно за сравненя. В долния пример показваме това. Но използваме I/O манипулатора boolalpha. Той заменя връщаните числени стойности с текст.
#include <iostream>
using namespace std;
int main() {
int x = 7;
cout << boolalpha << (12 > 3) << endl;
cout << boolalpha << (42 >= 100) << endl;
cout << boolalpha << (x == 5) << endl;
}Логически оператори
Съществуват няколко логически оператора, които се ползват в по сложни конструкции от горните. Те са логическо И (and), логическо ИЛИ (or) и логическо отрицание (NOT).
Логическо И
То се бележи с оператора &&. Може да го напишете и с „and„. Тази операция връща true само когато и двата операнда са true. Малка оптимизация, която компилатора прави тук е, че ако първия операнд е false няма нужда да разглеждаме втория операнд.
| x | y | x && y |
| true | false | false |
| false | true | false |
| true | true | true |
| false | false | false |
Логическо ИЛИ
То се бележи с оператора || . Може да го напишете и с „or„. Операцията връща true когато един от операндите е true. При изчисление C++ прави малка оптимизация. Очевидно е, че ако първия операнд е истина втория може и да не го проверяваме.
| x | y | x || y |
| true | false | true |
| false | true | true |
| true | true | true |
| false | false | false |
Логическо отрицание
Бележи се с ! или „not„. Връща обратната стойност на зададения операнд.
| x | !x |
| true | false |
| false | true |
Ето и елементарен пример.
#include <iostream>
using namespace std;
int main() {
bool a = true;
bool b = false;
cout << "a && b = " << boolalpha << (a && b) << endl;
cout << "a || b = " << boolalpha << (a || b) << endl;
cout << "!a = " << boolalpha << (!a) << endl;
}В следващите няколко урока ще се запознаем с видовете оператори и техния приоритет при изчисляване на изрази. Ще въведем конструкцията if() else за разклоняване на логиката на програмата. Ще се запознаем с циклите.
Въпроси и отговори
Проверете какво сте научили…
1. Какви са числените стойности на true и false?
true -> 1
false -> 0
2. Какво прави манипулатора boolalpha?
Променя начина по който се изписват булевите променливи в терминала. Изписва тескст true/false вместо числата 1 и 0.
3. Как се кaстват (преобразуват) различните типове данни към bool?
Всичко което е 0 се приема за false.
Всичко различно от 0 e true.
4*. Кой оператор има по – голям приоритет: && или ||?
(потърсете в интернет, не сме го учили)
Отговор
&& има по – висок приоритет от ||
5*. Нека имаме масив от 100 елемента. Елементите в масива започват от 0 и завършват на 99. Как бихте потвърдили, че променливата index = 12 показва елемент вътре в масива. Напишете програмата.
Отговор
#include <iostream>
using namespace std;
int main() {
int index = 12;
bool inArr = (index >= 0) && (index < 100);
if(inArr) {
cout << "index OK" << endl;
}
else {
cout << "index OUT of range" << endl;
}
}Тук за първи път ви показваме как работи конструкцията if() else.
if(z) { … изпълнява се, ако z == true } else { .. изпълнява се, ако z == false }
Иначе можеше да го напишете много по прост:
#include <iostream>
using namespace std;
int main() {
int index = 12;
bool inArr = (index >= 0) && (index < 100);
cout << boolalpha << inArr << " idex in array" << endl;
}6. Каква е стойността на result?
auto result = true || false && false;Отговор
Ако сте се запознали със задача 4* вече знаете, че && е с по висок приоритет от || . Следователно можем да сведем горния израз във формата:
auto result = true || (false && false);Което е:
auto result = true || falseОтговор:
auto result = trueСигурно ще питате за ‘auto‘. Това е подкана към компилатора. Той сам трябва да определи типа данни. Ако не го направи ще търсите „мамата му“. 🙂