У реальному житті, перед нами дуже часто виникають питання, на які можна відповісти однозначно: “Так” або “Ні”. Яблуко є фруктом? Так! Вам подобається спаржа? Ні!
Розглянемо твердження: “Яблуко — це фрукт”. Чи є це правдою? Так! Яблуко дійсно є фруктом. Або як щодо “Я люблю спаржу”. Абсолютна брехня (тьху!).
Подібні стейтменти, які мають тільки два можливих результати: так/правда чи ні/брехня, настільки поширені, що багато мов програмування додали спеціальний тип для роботи з ними — логічний тип даних. В С++ це логічний тип даних bool (від англ. “boolean”).
Змінні логічного типу даних
Логічні змінні — це змінні, діапазон яких складається лише з двох можливих значень: true
(1
) чи false
(0
).
Для оголошення логічної змінної використовується ключове слово bool
:
1 |
bool b; |
Ініціалізувати логічну змінну або виконати операцію присвоювання можна за допомогою ключових слів true
або false
:
1 2 3 4 |
bool b1 = true; // копіююча ініціалізація bool b2(false); // пряма ініціалізація bool b3 { true }; // uniform-ініціалізація (C++11) b3 = false; // операція присвоювання |
Аналогічно роботі унарного оператора мінус (-
), за допомогою якого ми можемо зробити число від’ємним, за допомогою логічного оператора НЕ (!
) ми можемо змінити true
на false
і навпаки (false
на true
):
1 2 |
bool b1 = !true; // значенням b1 є false bool b2(!false); // значенням b2 є true |
Насправді, логічні значення не зберігаються як "true"
або "false"
. Вони опрацьовуються в вигляді цілих чисел: замість true
— одиниця, замість false
— нуль.
Отже, якщо ми спробуємо вивести логічні значення за допомогою std::cout, то побачимо 0
або 1
:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> int main() { std::cout << true << std::endl; // замість true - 1 std::cout << !true << std::endl; // замість !true - 0 bool b(false); std::cout << b << std::endl; // b - false (0) std::cout << !b << std::endl; // !b - true (1) return 0; } |
Результат виконання програми:
1
0
0
1
Якщо ви хочете, щоб std::cout виводив "true"
або "false"
(замість цілих чисел), то тоді використовуйте std::boolalpha:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> int main() { std::cout << true << std::endl; std::cout << false << std::endl; std::cout << std::boolalpha; // виводимо логічні значення як "true" чи "false" std::cout << true << std::endl; std::cout << false << std::endl; return 0; } |
Результат виконання програми:
Використання логічного типу даних в розгалуженнях if
Дуже часто логічні змінні використовуються в розгалуженнях if. Розгалуження if виглядає наступним чином:
if (вираз) стейтмент1;
або так:
if (вираз) стейтмент1;
else стейтмент2;
(вираз)
ще називається “умовою” або “умовним виразом”.
В обох випадках, якщо результатом умови є ненульове значення, то виконується стейтмент1
. Якщо ж результатом умови є нульове значення, то виконується стейтмент2
.
Пам’ятайте, що true
— це 1 (ненульове значення), а false
— це 0 (нульове значення).
Тепер розглянемо приклад в коді:
1 2 3 4 |
if (true) // true - це умова std::cout << "The condition is true!" << std::endl; else std::cout << "The condition is false!" << std::endl; |
Результат:
The condition is true!
Що тут робиться? По-перше, ми починаємо з умови if, якою є логічне значення true
, тобто 1
(нульове значення), що означає, що виконуватися буде стейтмент1
.
Наступна програма працює аналогічно:
1 2 3 4 5 |
bool b(false); if (b) std::cout << "b is true!" << std::endl; else std::cout << "b is false!" << std::endl; |
Результат:
b is false!
Тут, під час перевірки умови, змінна b
має значення false
. false
— це 0
. Отже, перший стейтмент під if (який true
) пропускається, а другий, який під else (false
) — виконується.
А тепер розглянемо складніший приклад. Оператор рівності (==
) використовується для порівняння двох чисел (чи є вони рівними). Оператор ==
повертає true
, якщо операнди рівні і false
, якщо вони такими не є:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> int main() { std::cout << "Enter an integer: "; int x; std::cin >> x; if (x == 0) std::cout << "The value is zero" << std::endl; else std::cout << "The value is non-zero" << std::endl; return 0; } |
Результат виконання програми:
Enter an integer: 4
The value is non-zero
Давайте розберемося, що і як тут працює. По-перше, ми просимо користувача ввести ціле число. Після цього, за допомогою оператора ==
, ми перевіряємо, чи є користувацьке число нульовим. В прикладі вище 4
не дорівнює 0
, тому оператор ==
визначає умову як false
. Отже, виконується стейтмент2
(той, який під else), де ми виводимо "The value is non-zero"
.
Значення логічного типу даних, що повертаються
Логічні значення часто використовуються в якості значень, що повертаються, в функціях. Імена таких функцій дуже часто починаються зі слів is
(наприклад, isEqual
) або has
(наприклад, hasCommonDivisor
).
Розглянемо наступний приклад:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> // Повертаємо true, якщо x і y рівні, в іншому випадку повертаємо false bool isEqual(int x, int y) { return (x == y); // оператор == повертає true, якщо x дорівнює y, в іншому випадку - false } int main() { std::cout << "Enter an integer: "; int x; std::cin >> x; std::cout << "Enter another integer: "; int y; std::cin >> y; if (isEqual(x, y)) std::cout << x << " and " << y << " are equal" << std::endl; else std::cout << x << " and " << y << " are not equal" << std::endl; return 0; } |
Результат виконання програми:
Enter an integer: 5
Enter another integer: 5
5 and 5 are equal
Як це працює? По-перше, ми вказуємо значення змінним х
і у
. Потім перевіряється умова, що призводить до виклику функції isEqual(5, 5)
. Усередині цієї функції наші 2 числа порівнюються між собою (5==5
), що призводить до повернення значення true (так як 5=5
). Значення true
повертається назад в викликаючу функцію і виконується стейтмент1
, який виводить "5 and 5 are equal"
.
До логічних значень потрібно трохи звикнути, але, як тільки ви це зробите, то самі здивуєтеся, наскільки вони зручні і прості.
У всіх прикладах вище, в наших умовах були або логічні значення (true
чи false
), або логічні змінні, або функції, які повертають логічне значення. А що станеться, якщо ми не будемо використовувати логічне значення в умовах? Правильно! Якщо результатом умови буде будь-яке ненульове значення, то виконуватися буде стейтмент1
.
Тому, якщо спробувати зробити щось на кшталт наступного:
1 2 3 4 |
if (4) std::cout << "hi"; else std::cout << "bye"; |
То результатом буде hi
, так як 4
є ненульовим значенням.
Тест
Що таке просте число? Правильно! Це ціле додатне число більше одиниці, яке ділиться без залишку або на себе, або на одиницю. Напишіть програму, яка просить користувача ввести просте ціле число. Якщо користувач ввів одне з наступних чисел: 2
, 3
, 5
або 7
— програма повинна вивести The digit is prime
. В іншому випадку, The digit is not prime
.
Підказка: Використовуйте розгалуження if для порівняння чисел і логічні значення для відстеження того, чи є число користувача простим чи ні.
Відповідь
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <iostream> bool isPrime(int x) { if (x == 2) return true; if (x == 3) return true; if (x == 5) return true; if (x == 7) return true; return false; } int main() { std::cout << "Enter a single digit integer: "; int x; std::cin >> x; bool prime = isPrime(x); if (prime) std::cout << "The digit is prime" << std::endl; else std::cout << "The digit is not prime" << std::endl; return 0; } |