Логические операторы: не
Третий логический оператор, ! (восклицательный знак), называется отрицанием. Он превращает логическое значение в противоположное: !true — это false, а !false — это true. Читайте его как «не»:
bool is_raining = false;
if (!is_raining) {
printf("Зонт не нужен\n");
}Программа выведет:
Зонт не нуженis_raining равно false, поэтому !is_raining — это true, и блок выполняется. Читайте условие как «если дождя нет». Можно было бы написать и is_raining == false. Это означает то же самое, но ! короче.
Отрицание полезнее всего с логическими переменными и при объединении условий. «Магазин открыт и сегодня не праздник» — это is_open && !is_holiday. Со сравнениями оно обычно не нужно: вместо «возраст не меньше 18 — неверно» просто напишите противоположное сравнение, age < 18.
! действует только на то, что стоит сразу после него. Чтобы отрицать целое сравнение или составное условие, возьмите его в круглые скобки: !(points >= 50) или !(has_licence && has_car). Без скобок получится другое:
int points = 30;
if (!points >= 50) {
printf("Не сдано\n");
}Компилятор сообщает:
error: logical not is only applied to the left hand side of this comparison [-Werror,-Wlogical-not-parentheses]В !points >= 50 знак ! действует только на points. !points — это ложь, то есть 0, потому что 30 не равно 0, а 0 >= 50 — ложь, так что программа никогда не вывела бы Не сдано. Многие компиляторы пропускают это лишь с предупреждением, а здесь это ошибка. Правильно писать !(points >= 50) или, ещё проще, points < 50.
Задание
- 1
Вместо комментария напишите инструкцию
if, которая выводитПойду на улицу, если интернет не работает. Используйте!. - 2
Выходить на улицу стоит, только если нет дождя. Дополните условие с помощью
&&, чтобы оно было истинным, только если интернет не работает и одновременно нет дождя (!is_raining). Затем добавьте веткуelse, которая выводитПочитаю книгу.