Условный оператор if и логические выражения
Во многих задачах программа должна сравнить значения, проверить условие и выбрать, какой код выполнять дальше.
Логические выражения и тип boolean
|
Тип boolean хранит логические значения. У него только два значения: Каждая boolean-переменная хранит одно из этих двух значений. Результат любой логической операции тоже всегда имеет тип boolean. Именно такие значения использует условие if, когда решает, выполнять блок кода или пропустить его. |
Встроенный тип boolean в Java |
Самые важные логические операции для boolean:
a && bистинно, если истинны обе части.a || bистинно, если истинна хотя бы одна часть.!aменяетtrueнаfalseи наоборот.
Чтобы не гадать, удобно посмотреть все варианты в таблицах истинности:
|
|
Таблицы истинности для логических операций
Одно и то же условие иногда можно записать по-разному. Например, a && b и !(!a || !b) дают одинаковый результат:
a |
b |
a && b |
!a |
!b |
!a || !b |
!(!a || !b) |
|---|---|---|---|---|---|---|
false |
false |
false |
true |
true |
true |
false |
false |
true |
false |
true |
false |
true |
false |
true |
false |
false |
false |
true |
true |
false |
true |
true |
true |
false |
false |
false |
true |
Таблица показывает, что a && b и !(!a || !b) совпадают
Операции сравнения
Операции сравнения сравнивают два значения и дают результат типа boolean. Самые важные операторы сравнения в Java: ==, !=, <, <=, >, >=.
| чётное число? | (x % 2) == 0 |
| начало века? | (year % 100) == 0 |
| корректный месяц? | (month >= 1) && (month <= 12) |
Типичные выражения сравнения
Арифметические операции выполняются раньше сравнений, а сравнения раньше логических операций. Поэтому запись b * b - 4.0 * a * c >= 0.0 работает без внешних скобок.
Запись month >= 1 && month <= 12 тоже правильна, но в учебных примерах лучше писать (month >= 1) && (month <= 12), потому что так легче читать.
|
Операции сравнения вместе с логическими выражениями лежат в основе условий if. Именно они позволяют программе проверить условие и принять решение. |
Операторы сравнения и результат типа boolean |
Legacy
Логические выражения и тип boolean
В Java логическое выражение имеет тип boolean. Именно такое выражение ставят в условие if.
- Условие if - это логическое выражение типа boolean.
- После вычисления это выражение принимает одно из двух значений: true или false.
- if смотрит на это значение: при true выполняет блок кода, при false пропускает его.
Например, логическое выражение можно сначала сохранить в boolean-переменную, а потом использовать её в if:
int x = -8;
// Сохраняем результат логического выражения в boolean-переменную.
boolean isNegative = x < 0;
// if использует уже готовое значение true или false.
if (isNegative) {
x = -x;
}
System.out.println(x);
8
|
if (логическое выражение) {
команда 1; команда 2; } |
Тип boolean в Java: значения, литералы и логические операторы
Тип boolean имеет только два литерала:
Логическое значение чаще всего получается в результате сравнения двух выражений.
| Оператор | Смысл | true | false |
|---|---|---|---|
== |
равно | 2 == 2 |
2 == 3 |
!= |
не равно | 3 != 2 |
2 != 2 |
< |
меньше | 2 < 13 |
13 < 2 |
<= |
меньше или равно | 2 <= 2 |
3 <= 2 |
> |
больше | 13 > 2 |
2 > 13 |
>= |
больше или равно | 2 >= 2 |
2 >= 3 |
Операторы равенства и сравнения в Java
Простые логические выражения часто выглядят так:
| Вопрос | Выражение | Комментарий |
|---|---|---|
| Чётное ли число? | (x % 2) == 0 |
остаток при делении на 2 должен быть равен нулю |
| Делитель равен нулю? | denominator == 0 |
проверка перед делением |
| Количество минут делится на 60? | (minutes % 60) == 0 |
используем остаток от деления |
Логические операции
Если одного сравнения недостаточно, условия можно объединять с помощью логических операций !, && и ||.
Таблица истинности показывает, какое значение принимает логическое выражение при разных значениях true и false.
Таблица истинности для НЕ |
Таблица истинности для И |
Таблица истинности для ИЛИ |
||||||||||||||||||||||||||||||||||||||||||||||
Составные условия часто выглядят так:
| Вопрос | Выражение | Комментарий |
|---|---|---|
| Хотя бы одно из двух чисел положительное? | (a > 0) || (b > 0) |
достаточно, чтобы хотя бы одно условие выполнялось |
| Месяц корректный? | (month >= 1) && (month <= 12) |
оба условия должны быть истинны |
| Месяц некорректный? | !((month >= 1) && (month <= 12)) |
отрицание готового условия |
Приоритет операций
В выражениях сначала выполняются действия в скобках. Потом идут арифметические операции, затем сравнение. Среди логических операций сначала выполняется !, потом &&, потом ||.
Если рядом стоят операции одного уровня, они выполняются слева направо.
| Выражение | То же самое | Значение | Комментарий |
|---|---|---|---|
2 + 3 * 4 == 20 |
(2 + (3 * 4)) == 20 |
false |
сначала *, потом +, потом == |
(2 + 3) * 4 == 20 |
(5 * 4) == 20 |
true |
скобки меняют порядок действий |
7 % 2 == 1 && 5 > 3 |
((7 % 2) == 1) && (5 > 3) |
true |
сравнения выполняются раньше && |
!(7 % 2 == 0) |
!((7 % 2) == 0) |
true |
сначала вычисляется выражение в скобках |
true || false && false |
true || (false && false) |
true |
&& выполняется раньше || |
Приоритет операций в выражениях
Даже если скобки не обязательны, их часто ставят, чтобы выражение было легче читать: (month >= 1) && (month <= 12).
Сравнение строк
В Java строки сравнивают по тексту через equals().
true
Здесь обе строки содержат один и тот же текст, поэтому equals() возвращает true.
Но если написать так:
String first = "ко";
String second = "т";
String word = first + second;
System.out.println(word == "кот");
false
Хотя текст одинаковый, сравнение через == здесь не подходит.
Переменные boolean
Результат логического выражения можно сохранить в переменную типа boolean.
Имена таких переменных обычно начинаются с is, has, can и читаются как ответ на вопрос «да или нет»: isSummerMonth, isCorrectMonth, hasError.
int month = 7;
boolean isSummerMonth = (month == 6) || (month == 7) || (month == 8);
System.out.println(isSummerMonth);
true
Здесь переменная isSummerMonth хранит ответ на вопрос: «месяц летний или нет?»
Ещё пример:
int month = 13;
boolean isCorrectMonth = (month >= 1) && (month <= 12);
System.out.println(isCorrectMonth);
false
Такие переменные удобны тем, что их можно сначала вычислить, а потом использовать в if.
Ниже задачи, где основной навык — собрать условие в одно логическое выражение и вывести готовый ответ.
Задачи для тренировки: логические выражения и boolean
1. Запишите логическое выражение, которое истинно, если целые a и b равны.
Ответ
Это сравнение на равенство. Один знак = здесь не подойдёт: он делает присваивание.
2. Что выведет программа?
Ответ
Сначала Java считает %, потом сравнения, потом &&. Здесь обе части дают true, поэтому итог тоже true.
3. Как правильно проверить, что строки first и second равны по тексту?
Ответ
В Java строки сравнивают по тексту через equals(). Оператор == здесь не решает задачу так, как нужно.
4. Исправьте неверную проверку корректного месяца:
Ответ
Так писать нужно потому, что 1 <= month уже даёт значение типа boolean. После этого сравнивать результат с 12 уже нельзя.
5. Запишите объявление boolean-переменной с понятным именем, которая хранит ответ на вопрос: «Число x лежит на отрезке [left, right]». Гарантируется, что left <= right.
Ответ
Имя должно читаться как ответ на вопрос «да или нет». Поэтому isOnSegment лучше нейтральных вариантов вроде segment или value.
6. Осенние каникулы идут с 3 по 10 ноября включительно. Запишите выражение, которое истинно для даты day, month, если день попадает на каникулы.
Ответ
Нужны сразу три проверки: месяц должен быть ноябрём, а день должен попадать в границы от 3 до 10 включительно.
Яндекс Контест: «02. Условный оператор if» (boolean / логические выражения: задачи A-E)
Блок собран из пакета yandex-contests/packages/02-if-basic.
Контест: https://new.contest.yandex.ru/contests/92506/
Даны два целых числа a и b. Определите, равны ли они.
В первой строке записано целое число a, во второй — целое число b.
Выведите true, если a = b, и false в противном случае.
37 37
true
48 52
false
Даны две непустые строки без пробелов. Определите, равны ли они.
В первой строке записана строка s, во второй — строка t. Обе строки непустые, не содержат пробелов, длина каждой не превосходит 100 символов.
Выведите true, если строки совпадают, и false в противном случае.
apple apple
true
cat dog
false
Даны два целых числа a и b. Определите значение выражения a > b.
В единственной строке записаны два целых числа a и b.
Выведите true, если a > b, и false в противном случае.
7 3
true
2 9
false
Даны три целых числа a, b и c. Гарантируется, что b ≤ c. Определите, лежит ли число a на отрезке [b, c].
Число лежит на отрезке тогда и только тогда, когда выполняется неравенство b ≤ a ≤ c.
В единственной строке записаны три целых числа a, b и c.
Дополнительно гарантируется, что b ≤ c.
Выведите true, если a лежит на отрезке [b, c], и false в противном случае.
13 10 20
true
24 10 20
false
Осенние каникулы длятся с 3 по 10 ноября включительно. По заданной дате определите, попадает ли этот день на каникулы.
В единственной строке записаны два целых числа: день и месяц.
Гарантируется, что 1 ≤ день ≤ 31 и 1 ≤ месяц ≤ 12.
Выведите true, если заданная дата попадает на каникулы, и false в противном случае.
3 11
true
10 11
true
2 11
false
11 11
false
Условный оператор if
В условии if (...) должно стоять выражение типа boolean. Java сначала вычисляет это выражение, а потом решает, выполнять ли блок кода.

Если условие истинно, инструкции внутри блока выполняются. Если условие ложно, этот блок просто пропускается.
8
Здесь строка x = -x; выполняется только для отрицательных значений x.
После if можно написать не одну инструкцию, а целый блок кода. Это удобно, когда при истинном условии нужно выполнить несколько действий подряд.
int a = 9;
int b = 4;
if (a > b) {
int temp = a;
a = b;
b = temp;
}
System.out.println(a);
System.out.println(b);
4 9
Здесь внутри блока после if стоят несколько инструкций: объявление переменной temp и три присваивания. Переменная temp создана внутри блока, поэтому после закрывающей } к ней обращаться уже нельзя.
Два варианта: if ... else
Если из двух действий нужно выбрать ровно одно, используют if ... else.

int x = 7;
if ((x % 2) == 0) {
System.out.println("Чётное");
} else {
System.out.println("Нечётное");
}
Нечётное
В такой конструкции всегда выполняется ровно один блок: либо после if, либо после else.
Несколько вариантов: цепочка else if
Если вариантов больше двух, проверки удобно строить сверху вниз через else if.

int score = 73;
if (score >= 90) {
System.out.println("5");
} else if (score >= 70) {
System.out.println("4");
} else if (score >= 50) {
System.out.println("3");
} else {
System.out.println("2");
}
4
Проверки идут сверху вниз. Для 73 первое условие ложно, второе истинно, поэтому программа печатает 4 и дальше уже не идёт.
Независимые if и вложенные условия
Не все проверки нужно связывать в одну цепочку.

Последовательность из нескольких независимых if подходит, когда несколько действий могут выполниться подряд. В отличие от цепочки else if, здесь могут сработать сразу несколько блоков.
Например, число 12 одновременно положительное, чётное и делится на 3, поэтому могут сработать все три проверки:
int x = 12;
if (x > 0) {
System.out.println("Положительное");
}
if ((x % 2) == 0) {
System.out.println("Чётное");
}
if ((x % 3) == 0) {
System.out.println("Делится на 3");
}
Положительное Чётное Делится на 3
Все три строки напечатаются, потому что это три отдельные проверки, и каждая выполняется сама по себе.

Вложенный if нужен, когда вторая проверка имеет смысл только внутри первой. Если условие можно короче и понятнее записать одной формулой, лучше собрать его через && и ||.
Например, сначала можно разделить числа на неотрицательные и отрицательные, а потом внутри каждой ветки отдельно проверить чётность:
int x = -7;
if (x >= 0) {
if ((x % 2) == 0) {
System.out.println("Неотрицательное чётное");
} else {
System.out.println("Неотрицательное нечётное");
}
} else {
if ((x % 2) == 0) {
System.out.println("Отрицательное чётное");
} else {
System.out.println("Отрицательное нечётное");
}
}
Отрицательное нечётное
Сначала программа проверяет, неотрицательное ли число. Потом уже внутри выбранной ветки уточняет чётность, поэтому схема действительно разветвляется дважды.
Если же нужен только один конкретный случай, условие можно собрать одной формулой:
Отрицательное нечётное
Здесь обе проверки собраны в одно условие: число должно быть и отрицательным, и нечётным одновременно.
Упрощение сложных конструкций if через переменную boolean
Если условие в if получается длинным, его удобно сначала разложить на несколько boolean-переменных с понятными именами.
Для boolean-переменных обычно выбирают имена, которые читаются как ответ на вопрос «да или нет». Частые начала: is, has, can.
Например: isLeapYear, hasError, canVote.
int year = 2024;
boolean isDivisibleBy4 = (year % 4) == 0;
boolean isDivisibleBy100 = (year % 100) == 0;
boolean isDivisibleBy400 = (year % 400) == 0;
boolean isLeapYear = (isDivisibleBy4 && !isDivisibleBy100) || isDivisibleBy400;
if (isLeapYear) {
System.out.println("Високосный");
} else {
System.out.println("Не високосный");
}
Високосный
Здесь длинная проверка разбита на маленькие вопросы: делится ли год на 4, на 100, на 400. После этого строка if (isLeapYear) читается заметно легче.
Такой приём особенно полезен, когда длинное условие хочется сделать понятнее или использовать несколько раз.
Имена вроде isLeapYear и hasError обычно читаются лучше, чем нейтральные leapYear или error.
Ниже задачи, где основной навык — выбрать одно из действий через if, else if или последовательные проверки.
Задачи для тренировки: условный оператор if
1. Что выведет программа?
Ответ
Условие x < 0 истинно, поэтому внутри if число меняется с -8 на 8. Если бы условие было ложным, x остался бы без изменений.
2. Какую конструкцию лучше выбрать, если из двух чисел a и b нужно напечатать ровно одно: большее из них?
Ответ
if ... else.
Здесь из двух действий нужно выбрать ровно одно. Два независимых if только усложнили бы запись.
3. Что выведет программа?
int score = 95;
if (score >= 50) {
System.out.println("3");
} else if (score >= 70) {
System.out.println("4");
} else if (score >= 90) {
System.out.println("5");
} else {
System.out.println("2");
}
Ответ
Первая же проверка score >= 50 истинна, поэтому до следующих веток программа не дойдёт. В else if порядок условий критичен: более строгие проверки ставят выше.
4. Можно ли обратиться к переменной temp после закрывающей }?
Ответ
Нельзя.
temp существует только внутри блока if. После закрывающей } переменная уже вне области видимости, поэтому такой код не скомпилируется.
5. Что лучше использовать: цепочку if ... else if или несколько независимых if, если для числа 12 программа должна напечатать и "Положительное", и "Чётное"?
Ответ
Несколько независимых if.
Число 12 одновременно положительное и чётное, значит должны сработать обе проверки. Цепочка else if выбрала бы только одну ветку.
6. Запишите один if, который печатает "Отрицательное нечётное" только для таких значений x.
Ответ
Здесь нужен один конкретный случай, поэтому условие удобно сразу собрать через &&. Вложенный if здесь только сделал бы код длиннее.
7. Что выведет программа?
String timeOfDay = "Вечер";
int hour = 8;
if (hour < 18) {
timeOfDay = "День";
}
if (hour < 12) {
timeOfDay = "Утро";
}
if (hour < 6) {
timeOfDay = "Ночь";
}
System.out.println(timeOfDay);
Ответ
Это три независимых if. Сначала hour < 18 делает значение "День", потом hour < 12 переписывает его на "Утро", а последняя проверка hour < 6 уже ложна. Если здесь нужен был ровно один вариант времени суток, цепочка if ... else if ... else подошла бы лучше.
8. Перепишите код без лишней вложенности:
Ответ
Здесь каждая следующая проверка нужна не "внутри" предыдущей, а просто вместе с ней. Поэтому три условия удобнее сразу соединить через &&: код становится короче и читается легче.
9. Что выведет программа?
int temperature = 50;
if (temperature >= 0)
if (temperature >= 100)
System.out.println("Кипит");
else
System.out.println("Замерзает");
Ответ
else относится к ближайшему if, то есть к проверке temperature >= 100, а не к внешней проверке temperature >= 0. Поэтому при 50 внешнее условие истинно, внутреннее ложно, и печатается "Замерзает". Чтобы такой код не путал, лучше ставить фигурные скобки явно.
Яндекс Контест: «02. Условный оператор if» (if / ветвления: задачи F-R)
Блок собран из пакета yandex-contests/packages/02-if-basic.
Контест: https://new.contest.yandex.ru/contests/92506/
Даны два целых числа a и b. Выведите большее из них.
В первой строке записано целое число a, во второй — целое число b.
Выведите одно целое число — максимум из двух данных чисел.
18 42
42
7 7
7
Даны два целых числа a и b. Выведите меньшее из них.
В первой строке записано целое число a, во второй — целое число b.
Выведите одно целое число — минимум из двух данных чисел.
81 19
19
12 12
12
Дано целое число x. Определите его знак.
В единственной строке записано целое число x.
Выведите число 1, если x > 0, число -1, если x < 0, и число 0, если x = 0.
-57
-1
0
0
64
1
Дано целое число n. Определите, является ли оно четным.
В единственной строке записано целое число n.
Если число четное, выведите слово YES, иначе выведите слово NO.
В этой задаче нужно вывести именно YES или NO, а не true или false.
58
YES
73
NO
Даны два целых числа a и b. Выведите их в порядке неубывания.
В первой строке записано целое число a, во второй — целое число b.
Выведите два числа через пробел в порядке неубывания.
42 17
17 42
5 5
5 5
Даны три целых числа a, b и c. Найдите наибольшее из них.
В трех строках записаны целые числа a, b и c.
Выведите одно целое число — максимум из трех данных чисел.
4 9 7
9
6 6 2
6
Даны четыре целых числа a, b, c и d. Найдите наименьшее из них.
В единственной строке записаны четыре целых числа a, b, c и d.
Выведите одно целое число — минимум из четырех данных чисел.
4 5 6 7
4
8 3 3 10
3
Даны длины трех отрезков a, b и c. Определите, можно ли из них составить треугольник.
Треугольник существует тогда и только тогда, когда выполняются все три неравенства: a + b > c, a + c > b, b + c > a.
В единственной строке записаны три натуральных числа a, b и c — длины отрезков.
Если из данных отрезков можно составить треугольник, выведите слово YES, иначе выведите слово NO.
7 8 13
YES
3 4 9
NO
Даны координаты двух точек. Все координаты отличны от нуля. Определите, лежат ли эти точки в одной координатной четверти. Координатные четверти показаны на рисунке.

В четырех строках записаны целые числа x1, y1, x2 и y2.
Дополнительно гарантируется, что все координаты отличны от нуля.
Если точки лежат в одной координатной четверти, выведите слово YES, иначе выведите слово NO.
3 5 7 1
YES
-4 2 6 7
NO
Дано целое число y — номер года. Определите, является ли этот год високосным.
Год является високосным, если он делится на 400 или делится на 4, но не делится на 100.
В единственной строке записано целое число y — номер года.
Если год високосный, выведите слово YES, иначе выведите слово NO.
2000
YES
1900
NO
2004
YES
2100
NO
Даны три целых числа a, b и c. Выведите их в порядке неубывания.
В трех строках записаны целые числа a, b и c.
Выведите три числа через пробел в порядке неубывания.
3 1 2
1 2 3
3 1 3
1 3 3
Дано целое число n. Выведите:
One, если n = 1;Two, если n = 2;Three, если n = 3;Other во всех остальных случаях.
В единственной строке записано целое число n.
Выведите одно слово: One, Two, Three или Other.
1
One
3
Three
0
Other
-5
Other
По данному числу n выведите одну из строк: n korov, n korova или n korovy.
Слова korov, korova и korovy нужно выводить именно на латинице.
В единственной строке записано целое число n. Гарантируется, что 0 ≤ n < 100.
Выведите число n и подходящее слово korov, korova или korovy через один пробел.
1
1 korova
2
2 korovy
5
5 korov
11
11 korov
14
14 korov
Примеры
Ниже собраны типичные ситуации, где удобно использовать разные формы if.
Если температура ниже нуля, напечатаем совет надеть шапку.
Здесь одна простая проверка: мороз или не мороз.
Проверяем, попадает ли число в промежуток от 10 до 99.
В условии сразу две проверки, объединённые через &&.
Если минут 60 или больше, переводим лишние минуты в часы.
int hours = 2;
int minutes = 75;
if (minutes >= 60) {
hours = hours + 1;
minutes = minutes - 60;
}
System.out.println(hours);
System.out.println(minutes);
Один if может запускать сразу несколько команд внутри блока. При этих данных программа напечатает 3 и 15.
По очереди обновляем максимум из трёх чисел.
int a = 7;
int b = 12;
int c = 9;
int max = a;
if (b > max) {
max = b;
}
if (c > max) {
max = c;
}
System.out.println(max);
Это две независимые проверки: сначала сравниваем b, потом отдельно c. В конце программа напечатает 12.
Из двух ответов выбирается ровно один: чётное или нечётное.
int n = 17;
if ((n % 2) == 0) {
System.out.println("Чётное");
} else {
System.out.println("Нечётное");
}
Здесь всегда выполняется либо ветка if, либо ветка else.
Если не тепло, печатаем второй вариант: Прохладно.
int temperature = 12;
if (temperature >= 15) {
System.out.println("Тепло");
} else {
System.out.println("Прохладно");
}
Если условие ложно, программа сразу переходит в блок else.
Сначала проверяем зачёт, потом внутри этой ветки смотрим, отличный ли результат.
int score = 92;
if (score >= 50) {
System.out.println("Зачёт");
if (score >= 90) {
System.out.println("Отличный результат");
}
} else {
System.out.println("Нужно ещё потренироваться");
}
Вторая проверка имеет смысл только после первой.
Если на улице мороз, даём один совет; если мороз сильный, добавляем второй.
int temperature = -12;
if (temperature < 0) {
System.out.println("Надень шапку");
if (temperature <= -10) {
System.out.println("Надень варежки");
}
} else {
System.out.println("Можно без шапки");
}
Вложенный if стоит внутри ветки про мороз, потому что вне неё он не нужен.
Выбираем один из трёх вариантов по количеству цифр.
int n = 57;
if (n < 10) {
System.out.println("Одна цифра");
} else if (n < 100) {
System.out.println("Две цифры");
} else {
System.out.println("Три цифры или больше");
}
Такая цепочка идёт сверху вниз и останавливается на первой подходящей ветке.
По числу определяем цвет сигнала светофора.
int signal = 2;
if (signal == 1) {
System.out.println("Красный");
} else if (signal == 2) {
System.out.println("Жёлтый");
} else if (signal == 3) {
System.out.println("Зелёный");
} else {
System.out.println("Неизвестный сигнал");
}
Проверки идут сверху вниз и останавливаются на первом подходящем варианте.
Различаем отрицательное число, ноль и положительное число.
int x = -8;
if (x < 0) {
System.out.println("Отрицательное");
} else if (x == 0) {
System.out.println("Ноль");
} else {
System.out.println("Положительное");
}
Здесь тоже выбирается ровно одна ветка.
По часу выбираем подходящее название части дня.
int hour = 15;
if (hour < 6) {
System.out.println("Ночь");
} else if (hour < 12) {
System.out.println("Утро");
} else if (hour < 18) {
System.out.println("День");
} else {
System.out.println("Вечер");
}
В такой цепочке else if программа тоже выбирает только одну ветку.
Логические выражения и тип bool
В C++ логическое выражение имеет тип bool. Именно такое выражение ставят в условие if.
- Условие
if- это логическое выражение типаbool. - После вычисления это выражение принимает одно из двух значений:
trueилиfalse. ifсмотрит на это значение: приtrueвыполняет блок{ ... }, приfalseпропускает его.
Например, логическое выражение можно сначала сохранить в переменную bool, а потом использовать её в if:
8
Здесь выражение x < 0 сначала вычисляется и записывается в переменную isNegative типа bool, а затем if использует уже готовое логическое значение.
|
if (логическое выражение) {
команда 1; команда 2; } |
Тип bool в C++: значения, литералы и логические операторы
Тип bool имеет только два литерала:
Во всех примерах ниже, где логическое значение выводится напрямую, используем boolalpha, чтобы cout печатал true и false, а не 1 и 0.
Логическое значение чаще всего получается в результате сравнения двух выражений.
| Оператор | Смысл | true | false |
|---|---|---|---|
== |
равно | 2 == 2 |
2 == 3 |
!= |
не равно | 3 != 2 |
2 != 2 |
< |
меньше | 2 < 13 |
13 < 2 |
<= |
меньше или равно | 2 <= 2 |
3 <= 2 |
> |
больше | 13 > 2 |
2 > 13 |
>= |
больше или равно | 2 >= 2 |
2 >= 3 |
Операторы равенства и сравнения в C++
Простые логические выражения часто выглядят так:
| Вопрос | Выражение | Комментарий |
|---|---|---|
| Чётное ли число? | (x % 2) == 0 |
остаток при делении на 2 должен быть равен нулю |
| Делитель равен нулю? | denominator == 0 |
проверка перед делением |
| Количество минут делится на 60? | (minutes % 60) == 0 |
используем остаток от деления |
Логические операции
Если одного сравнения недостаточно, условия можно объединять с помощью логических операций !, && и ||.
Таблица истинности показывает, какое значение принимает логическое выражение при разных значениях true и false.
Таблица истинности для НЕ |
Таблица истинности для И |
Таблица истинности для ИЛИ |
||||||||||||||||||||||||||||||||||||||||||||||
Составные условия часто выглядят так:
| Вопрос | Выражение | Комментарий |
|---|---|---|
| Хотя бы одно из двух чисел положительное? | (a > 0) || (b > 0) |
достаточно, чтобы хотя бы одно условие выполнялось |
| Месяц корректный? | (month >= 1) && (month <= 12) |
оба условия должны быть истинны |
| Месяц некорректный? | !((month >= 1) && (month <= 12)) |
отрицание готового условия |
Приоритет операций
В выражениях сначала выполняются действия в скобках. Потом идут арифметические операции, затем сравнение. Среди логических операций сначала выполняется !, потом &&, потом ||.
Если рядом стоят операции одного уровня, они выполняются слева направо.
| Выражение | То же самое | Значение | Комментарий |
|---|---|---|---|
2 + 3 * 4 == 20 |
(2 + (3 * 4)) == 20 |
false |
сначала *, потом +, потом == |
(2 + 3) * 4 == 20 |
(5 * 4) == 20 |
true |
скобки меняют порядок действий |
7 % 2 == 1 && 5 > 3 |
((7 % 2) == 1) && (5 > 3) |
true |
сравнения выполняются раньше && |
!(7 % 2 == 0) |
!((7 % 2) == 0) |
true |
сначала вычисляется выражение в скобках |
true || false && false |
true || (false && false) |
true |
&& выполняется раньше || |
Приоритет операций в выражениях
Даже если скобки не обязательны, их часто ставят, чтобы выражение было легче читать: (month >= 1) && (month <= 12).
Сравнение строк
В C++ строки типа string сравнивают по тексту через == и !=.
true
Здесь boolalpha нужен только для вывода. Само сравнение по тексту делает оператор ==.
Ещё пример:
string first = "ко";
string second = "т";
string word = first + second;
cout << boolalpha << (word == "кот") << endl;
true
В C++ для string оператор == сравнивает именно текст, поэтому здесь результат true.
Переменные bool
Результат логического выражения можно сохранить в переменную типа bool.
Имена таких переменных обычно начинаются с is, has, can и читаются как ответ на вопрос «да или нет»: isSummerMonth, isCorrectMonth, hasError.
int month = 7;
bool isSummerMonth = (month == 6) || (month == 7) || (month == 8);
cout << boolalpha << isSummerMonth << endl;
true
Здесь переменная isSummerMonth хранит ответ на вопрос: «месяц летний или нет?»
Ещё пример:
int month = 13;
bool isCorrectMonth = (month >= 1) && (month <= 12);
cout << boolalpha << isCorrectMonth << endl;
false
Такие переменные удобны тем, что их можно сначала вычислить, а потом использовать в if.
Ниже задачи, где основной навык — собрать условие в одно логическое выражение и вывести готовый ответ.
Задачи для тренировки: логические выражения и bool
1. Запишите логическое выражение, которое истинно, если целые a и b равны.
Ответ
Это сравнение на равенство. Один знак = здесь не подойдёт: он делает присваивание.
2. Что выведет программа?
Ответ
Сначала C++ считает %, потом сравнения, потом &&. Здесь обе части дают true, поэтому итог тоже true.
3. Как правильно проверить, что строки first и second равны по тексту?
Ответ
Для string в C++ оператор == как раз сравнивает текст. Это одно из отличий C++ от Java.
4. Исправьте неверную проверку корректного месяца:
Ответ
В C++ такая цепочка не работает как в математике. Сначала вычисляется 1 <= month, получается true или false, а потом это значение уже сравнивается с 12.
5. Запишите объявление bool-переменной с понятным именем, которая хранит ответ на вопрос: «Число x лежит на отрезке [left, right]». Гарантируется, что left <= right.
Ответ
Имя должно читаться как ответ на вопрос «да или нет». Поэтому isOnSegment лучше нейтральных вариантов вроде segment или value.
6. Осенние каникулы идут с 3 по 10 ноября включительно. Запишите выражение, которое истинно для даты day, month, если день попадает на каникулы.
Ответ
Нужны сразу три проверки: месяц должен быть ноябрём, а день должен попадать в границы от 3 до 10 включительно.
Яндекс Контест: «02. Условный оператор if» (boolean / логические выражения: задачи A-E)
Блок собран из пакета yandex-contests/packages/02-if-basic.
Контест: https://new.contest.yandex.ru/contests/92506/
Для C++ в задачах на вывод true и false удобно один раз включить cout << boolalpha;, а потом печатать само логическое выражение.
Даны два целых числа a и b. Определите, равны ли они.
В первой строке записано целое число a, во второй — целое число b.
Выведите true, если a = b, и false в противном случае.
37 37
true
48 52
false
Даны две непустые строки без пробелов. Определите, равны ли они.
В первой строке записана строка s, во второй — строка t. Обе строки непустые, не содержат пробелов, длина каждой не превосходит 100 символов.
Выведите true, если строки совпадают, и false в противном случае.
apple apple
true
cat dog
false
Даны два целых числа a и b. Определите значение выражения a > b.
В единственной строке записаны два целых числа a и b.
Выведите true, если a > b, и false в противном случае.
7 3
true
2 9
false
Даны три целых числа a, b и c. Гарантируется, что b ≤ c. Определите, лежит ли число a на отрезке [b, c].
Число лежит на отрезке тогда и только тогда, когда выполняется неравенство b ≤ a ≤ c.
В единственной строке записаны три целых числа a, b и c.
Дополнительно гарантируется, что b ≤ c.
Выведите true, если a лежит на отрезке [b, c], и false в противном случае.
13 10 20
true
24 10 20
false
Осенние каникулы длятся с 3 по 10 ноября включительно. По заданной дате определите, попадает ли этот день на каникулы.
В единственной строке записаны два целых числа: день и месяц.
Гарантируется, что 1 ≤ день ≤ 31 и 1 ≤ месяц ≤ 12.
Выведите true, если заданная дата попадает на каникулы, и false в противном случае.
3 11
true
10 11
true
2 11
false
11 11
false
Условный оператор if
В if (...) обычно пишут выражение типа bool. C++ также умеет неявно приводить к bool числа и другие значения, но в задачах лучше писать явные сравнения.

Если условие истинно, инструкции внутри { ... } выполняются. Если условие ложно, этот блок просто пропускается.
8
Здесь строка x = -x; выполняется только для отрицательных значений x.
После if можно написать не одну инструкцию, а целый блок кода. Это удобно, когда при истинном условии нужно выполнить несколько действий подряд.
int a = 9;
int b = 4;
if (a > b) {
int temp = a;
a = b;
b = temp;
}
cout << a << endl;
cout << b << endl;
4 9
Здесь внутри блока после if стоят несколько инструкций: объявление переменной temp и три присваивания. Переменная temp создана внутри блока, поэтому после закрывающей } к ней обращаться уже нельзя.
Два варианта: if ... else
Если из двух действий нужно выбрать ровно одно, используют if ... else.

Нечётное
В такой конструкции всегда выполняется ровно один блок: либо после if, либо после else.
Несколько вариантов: цепочка else if
Если вариантов больше двух, проверки удобно строить сверху вниз через else if.

int score = 73;
if (score >= 90) {
cout << "5" << endl;
} else if (score >= 70) {
cout << "4" << endl;
} else if (score >= 50) {
cout << "3" << endl;
} else {
cout << "2" << endl;
}
4
Проверки идут сверху вниз. Для 73 первое условие ложно, второе истинно, поэтому программа печатает 4 и дальше уже не идёт.
Независимые if и вложенные условия
Не все проверки нужно связывать в одну цепочку.

Последовательность из нескольких независимых if подходит, когда несколько действий могут выполниться подряд. В отличие от цепочки else if, здесь могут сработать сразу несколько блоков.
Например, число 12 одновременно положительное, чётное и делится на 3, поэтому могут сработать все три проверки:
int x = 12;
if (x > 0) {
cout << "Положительное" << endl;
}
if ((x % 2) == 0) {
cout << "Чётное" << endl;
}
if ((x % 3) == 0) {
cout << "Делится на 3" << endl;
}
Положительное Чётное Делится на 3
Все три строки напечатаются, потому что это три отдельные проверки, и каждая выполняется сама по себе.

Вложенный if нужен, когда вторая проверка имеет смысл только внутри первой. Если условие можно короче и понятнее записать одной формулой, лучше собрать его через && и ||.
Например, сначала можно разделить числа на неотрицательные и отрицательные, а потом внутри каждой ветки отдельно проверить чётность:
int x = -7;
if (x >= 0) {
if ((x % 2) == 0) {
cout << "Неотрицательное чётное" << endl;
} else {
cout << "Неотрицательное нечётное" << endl;
}
} else {
if ((x % 2) == 0) {
cout << "Отрицательное чётное" << endl;
} else {
cout << "Отрицательное нечётное" << endl;
}
}
Отрицательное нечётное
Сначала программа проверяет, неотрицательное ли число. Потом уже внутри выбранной ветки уточняет чётность, поэтому схема действительно разветвляется дважды.
Если же нужен только один конкретный случай, условие можно собрать одной формулой:
Отрицательное нечётное
Здесь обе проверки собраны в одно условие: число должно быть и отрицательным, и нечётным одновременно.
Упрощение сложных конструкций if через переменную bool
Если условие в if получается длинным, его удобно сначала разложить на несколько bool-переменных с понятными именами.
Для bool-переменных обычно выбирают имена, которые читаются как ответ на вопрос «да или нет». Частые начала: is, has, can.
Например: isLeapYear, hasError, canVote.
int year = 2024;
bool isDivisibleBy4 = (year % 4) == 0;
bool isDivisibleBy100 = (year % 100) == 0;
bool isDivisibleBy400 = (year % 400) == 0;
bool isLeapYear = (isDivisibleBy4 && !isDivisibleBy100) || isDivisibleBy400;
if (isLeapYear) {
cout << "Високосный" << endl;
} else {
cout << "Не високосный" << endl;
}
Високосный
Здесь длинная проверка разбита на маленькие вопросы: делится ли год на 4, на 100, на 400. После этого строка if (isLeapYear) читается заметно легче.
Такой приём особенно полезен, когда длинное условие хочется сделать понятнее или использовать несколько раз.
Имена вроде isLeapYear и hasError обычно читаются лучше, чем нейтральные leapYear или error.
Ниже задачи, где основной навык — выбрать одно из действий через if, else if или последовательные проверки.
Задачи для тренировки: условный оператор if
1. Что выведет программа?
Ответ
Условие x < 0 истинно, поэтому внутри if число меняется с -8 на 8. Если бы условие было ложным, x остался бы без изменений.
2. Какую конструкцию лучше выбрать, если из двух чисел a и b нужно напечатать ровно одно: большее из них?
Ответ
if ... else.
Здесь из двух действий нужно выбрать ровно одно. Два независимых if только усложнили бы запись.
3. Что выведет программа?
int score = 95;
if (score >= 50) {
cout << "3" << endl;
} else if (score >= 70) {
cout << "4" << endl;
} else if (score >= 90) {
cout << "5" << endl;
} else {
cout << "2" << endl;
}
Ответ
Первая же проверка score >= 50 истинна, поэтому до следующих веток программа не дойдёт. В else if порядок условий критичен: более строгие проверки ставят выше.
4. Можно ли обратиться к переменной temp после закрывающей }?
Ответ
Нельзя.
temp существует только внутри блока if. После закрывающей } переменная уже вне области видимости, поэтому такой код не скомпилируется.
5. Что лучше использовать: цепочку if ... else if или несколько независимых if, если для числа 12 программа должна напечатать и "Положительное", и "Чётное"?
Ответ
Несколько независимых if.
Число 12 одновременно положительное и чётное, значит должны сработать обе проверки. Цепочка else if выбрала бы только одну ветку.
6. Запишите один if, который печатает "Отрицательное нечётное" только для таких значений x.
Ответ
Здесь нужен один конкретный случай, поэтому условие удобно сразу собрать через &&. Вложенный if здесь только сделал бы код длиннее.
7. Что выведет программа?
string timeOfDay = "Вечер";
int hour = 8;
if (hour < 18) {
timeOfDay = "День";
}
if (hour < 12) {
timeOfDay = "Утро";
}
if (hour < 6) {
timeOfDay = "Ночь";
}
cout << timeOfDay << endl;
Ответ
Это три независимых if. Сначала hour < 18 делает значение "День", потом hour < 12 переписывает его на "Утро", а последняя проверка hour < 6 уже ложна. Если здесь нужен был ровно один вариант времени суток, цепочка if ... else if ... else подошла бы лучше.
8. Перепишите код без лишней вложенности:
Ответ
Здесь каждая следующая проверка нужна не "внутри" предыдущей, а просто вместе с ней. Поэтому три условия удобнее сразу соединить через &&: код становится короче и читается легче.
9. Что выведет программа?
int temperature = 50;
if (temperature >= 0)
if (temperature >= 100)
cout << "Кипит" << endl;
else
cout << "Замерзает" << endl;
Ответ
else относится к ближайшему if, то есть к проверке temperature >= 100, а не к внешней проверке temperature >= 0. Поэтому при 50 внешнее условие истинно, внутреннее ложно, и печатается "Замерзает". Чтобы такой код не путал, лучше ставить фигурные скобки явно.
Яндекс Контест: «02. Условный оператор if» (if / ветвления: задачи F-R)
Блок собран из пакета yandex-contests/packages/02-if-basic.
Контест: https://new.contest.yandex.ru/contests/92506/
Даны два целых числа a и b. Выведите большее из них.
В первой строке записано целое число a, во второй — целое число b.
Выведите одно целое число — максимум из двух данных чисел.
18 42
42
7 7
7
Даны два целых числа a и b. Выведите меньшее из них.
В первой строке записано целое число a, во второй — целое число b.
Выведите одно целое число — минимум из двух данных чисел.
81 19
19
12 12
12
Дано целое число x. Определите его знак.
В единственной строке записано целое число x.
Выведите число 1, если x > 0, число -1, если x < 0, и число 0, если x = 0.
-57
-1
0
0
64
1
Дано целое число n. Определите, является ли оно четным.
В единственной строке записано целое число n.
Если число четное, выведите слово YES, иначе выведите слово NO.
В этой задаче нужно вывести именно YES или NO, а не true или false.
58
YES
73
NO
Даны два целых числа a и b. Выведите их в порядке неубывания.
В первой строке записано целое число a, во второй — целое число b.
Выведите два числа через пробел в порядке неубывания.
42 17
17 42
5 5
5 5
Даны три целых числа a, b и c. Найдите наибольшее из них.
В трех строках записаны целые числа a, b и c.
Выведите одно целое число — максимум из трех данных чисел.
4 9 7
9
6 6 2
6
Даны четыре целых числа a, b, c и d. Найдите наименьшее из них.
В единственной строке записаны четыре целых числа a, b, c и d.
Выведите одно целое число — минимум из четырех данных чисел.
4 5 6 7
4
8 3 3 10
3
Даны длины трех отрезков a, b и c. Определите, можно ли из них составить треугольник.
Треугольник существует тогда и только тогда, когда выполняются все три неравенства: a + b > c, a + c > b, b + c > a.
В единственной строке записаны три натуральных числа a, b и c — длины отрезков.
Если из данных отрезков можно составить треугольник, выведите слово YES, иначе выведите слово NO.
7 8 13
YES
3 4 9
NO
Даны координаты двух точек. Все координаты отличны от нуля. Определите, лежат ли эти точки в одной координатной четверти. Координатные четверти показаны на рисунке.

В четырех строках записаны целые числа x1, y1, x2 и y2.
Дополнительно гарантируется, что все координаты отличны от нуля.
Если точки лежат в одной координатной четверти, выведите слово YES, иначе выведите слово NO.
3 5 7 1
YES
-4 2 6 7
NO
Дано целое число y — номер года. Определите, является ли этот год високосным.
Год является високосным, если он делится на 400 или делится на 4, но не делится на 100.
В единственной строке записано целое число y — номер года.
Если год високосный, выведите слово YES, иначе выведите слово NO.
2000
YES
1900
NO
2004
YES
2100
NO
Даны три целых числа a, b и c. Выведите их в порядке неубывания.
В трех строках записаны целые числа a, b и c.
Выведите три числа через пробел в порядке неубывания.
3 1 2
1 2 3
3 1 3
1 3 3
Дано целое число n. Выведите:
One, если n = 1;Two, если n = 2;Three, если n = 3;Other во всех остальных случаях.
В единственной строке записано целое число n.
Выведите одно слово: One, Two, Three или Other.
1
One
3
Three
0
Other
-5
Other
По данному числу n выведите одну из строк: n korov, n korova или n korovy.
Слова korov, korova и korovy нужно выводить именно на латинице.
В единственной строке записано целое число n. Гарантируется, что 0 ≤ n < 100.
Выведите число n и подходящее слово korov, korova или korovy через один пробел.
1
1 korova
2
2 korovy
5
5 korov
11
11 korov
14
14 korov
Примеры
Ниже собраны типичные ситуации, где удобно использовать разные формы if.
Когда нужно просто проверить условие:
| Комментарий | Пример |
|---|---|
|
Мороз. Проверяем один факт: ниже ли температура нуля. |
int temperature = -3;
if (temperature < 0) {
cout << "Надень шапку" << endl;
}
|
|
Двузначное число. В одном if стоит составное условие: число должно быть не меньше 10 и не больше 99.
|
int n = 42;
if ((n >= 10) && (n <= 99)) {
cout << "Двузначное число" << endl;
}
|
|
Минуты и часы. Один if может запускать несколько команд подряд. После выполнения здесь получится 3 часа и 15 минут.
|
int hours = 2;
int minutes = 75;
if (minutes >= 60) {
hours = hours + 1;
minutes = minutes - 60;
}
cout << hours << endl;
cout << minutes << endl;
|
Когда несколько проверок могут сработать подряд:
| Комментарий | Пример |
|---|---|
|
Максимум из трёх чисел. Это две независимые проверки: сначала сравниваем b, потом отдельно c. В конце напечатается 12.
|
int a = 7;
int b = 12;
int c = 9;
int max = a;
if (b > max) {
max = b;
}
if (c > max) {
max = c;
}
cout << max << endl;
|
Когда из двух ответов нужно выбрать ровно один:
| Комментарий | Пример |
|---|---|
|
Чётное или нечётное. Формат if ... else нужен, когда из двух ответов выбирается ровно один.
|
int n = 17;
if ((n % 2) == 0) {
cout << "Чётное" << endl;
} else {
cout << "Нечётное" << endl;
}
|
|
Тепло или прохладно. Если условие ложно, программа сразу переходит в блок else.
|
int temperature = 12;
if (temperature >= 15) {
cout << "Тепло" << endl;
} else {
cout << "Прохладно" << endl;
}
|
Когда вторая проверка имеет смысл только после первой:
| Комментарий | Пример |
|---|---|
|
Зачёт и отличная работа. Сначала выясняем, есть ли зачёт, и только потом уточняем результат. |
int score = 92;
if (score >= 50) {
cout << "Зачёт" << endl;
if (score >= 90) {
cout << "Отличный результат" << endl;
}
} else {
cout << "Нужно ещё потренироваться" << endl;
}
|
|
Мороз и сильный мороз. Второй if имеет смысл только внутри ветки про мороз.
|
int temperature = -12;
if (temperature < 0) {
cout << "Надень шапку" << endl;
if (temperature <= -10) {
cout << "Надень варежки" << endl;
}
} else {
cout << "Можно без шапки" << endl;
}
|
Когда вариантов больше двух и нужен один итоговый ответ:
| Комментарий | Пример |
|---|---|
|
Сколько цифр в числе. Здесь из нескольких вариантов выбирается ровно один. |
int n = 57;
if (n < 10) {
cout << "Одна цифра" << endl;
} else if (n < 100) {
cout << "Две цифры" << endl;
} else {
cout << "Три цифры или больше" << endl;
}
|
|
Светофор. Проверки идут сверху вниз и останавливаются на первом подходящем варианте. |
int signal = 2;
if (signal == 1) {
cout << "Красный" << endl;
} else if (signal == 2) {
cout << "Жёлтый" << endl;
} else if (signal == 3) {
cout << "Зелёный" << endl;
} else {
cout << "Неизвестный сигнал" << endl;
}
|
|
Знак числа. Такая цепочка различает три случая: отрицательное число, ноль и положительное число. |
int x = -8;
if (x < 0) {
cout << "Отрицательное" << endl;
} else if (x == 0) {
cout << "Ноль" << endl;
} else {
cout << "Положительное" << endl;
}
|
|
Время суток. В такой цепочке else if программа тоже выбирает только одну ветку.
|
int hour = 15;
if (hour < 6) {
cout << "Ночь" << endl;
} else if (hour < 12) {
cout << "Утро" << endl;
} else if (hour < 18) {
cout << "День" << endl;
} else {
cout << "Вечер" << endl;
}
|