Истина и ложь
У любого сравнения есть ответ: да или нет. Такие значения «да или нет» называются логическими значениями — в честь математика Джорджа Буля. В C их тип данных называется bool, и у него всего два значения: true и false. Чтобы ими пользоваться, напишите в начале программы #include <stdbool.h>, так же как для printf вы пишете #include <stdio.h>:
#include <stdbool.h>
#include <stdio.h>
int main(void) {
int age = 20;
bool is_adult = age >= 18;
printf("Совершеннолетний: %d\n", is_adult);
if (is_adult) {
printf("Вы можете голосовать\n");
}
return 0;
}Программа выведет:
Совершеннолетний: 1
Вы можете голосоватьЧитайте строку с bool справа налево: сначала программа сравнивает age >= 18 — это истина, — а затем = сохраняет результат в is_adult. Условие if (is_adult) означает то же, что и if (is_adult == true). Оно просто короче, поэтому программисты пишут именно так. Имена логических переменных обычно начинаются с is_ или has_ (is_adult, has_ticket), чтобы читаться как вопрос с ответом «да или нет».
Почему printf вывел 1? Долгое время в C не было bool, и под капотом по-прежнему работают числа: true — это 1, а false — это 0. Поэтому bool выводят с помощью %d. Любое сравнение тоже даёт число 1 или 0:
printf("%d\n", 5 > 3);
printf("%d\n", 2 > 3);Программа выведет:
1
0А условие в C — это просто число: 0 означает ложь, а любое другое число — истину. Если забыть #include <stdbool.h>, компилятор не будет знать слова bool и сообщит error: use of undeclared identifier 'bool'.
Логическая переменная пригодится, например, для чётных чисел. Число чётное, когда при делении на два ничего не остаётся, то есть когда остаток number % 2 равен 0:
int number = 14;
bool is_even = number % 2 == 0;
printf("Чётное: %d\n", is_even);Программа выведет:
Чётное: 1Сначала программа вычисляет остаток 14 % 2, он равен 0, и только потом сравнивает его с нулём: % выполняется раньше ==, как умножение раньше сложения. Для нечётного числа, например 7, остаток равен 1, и is_even ложно. Если бы вы по ошибке написали здесь один знак равенства, number % 2 = 0, компилятор сообщил бы error: expression is not assignable, потому что нельзя ничего сохранить в результат вычисления.
Задание
- 1
Добавьте
#include <stdbool.h>в начало программы. Затем подprintfсоздайте переменнуюis_evenтипаbool, в которой лежит результат сравненияnumber % 2 == 0, и выведите её:printf("Чётное: %d\n", is_even);. Число 7 нечётное, поэтому программа выведетЧётное: 0. - 2
Ниже напишите инструкцию
ifс условиемis_even, которая выводитЧисло чётное, и добавьте к ней веткуelse, которая выводитЧисло нечётное. Программа выводит:Число: 7 Чётное: 0 Число нечётное