Логические выражения и тип boolean
В Java тип boolean используют для логических значений.
Тип 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 здесь только сделал бы код длиннее.
Яндекс Контест: «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 выведите одну из строк: <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korov, <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korova или <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> 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
Логические выражения и тип bool
В C++ тип bool используют для логических значений.
Тип 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 здесь только сделал бы код длиннее.
Яндекс Контест: «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 выведите одну из строк: <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korov, <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korova или <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> 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
В Python оператор if выбирает, какой блок кода выполнить, в зависимости от условия.
Условия обычно пишут как сравнение (x > 0, a == b) или как логическое выражение с and, or, not.
Основное
if условие: – выполнить блок, если условие истинно.
if ...: ... else: ... – выбрать один из двух вариантов.
if ...: ... elif ...: ... else: ... – выбрать один из нескольких вариантов.
В Python важно, что блоки кода задаются отступами.
Пример: знак числа
x = int(input())
if x > 0:
print("Положительное")
elif x < 0:
print("Отрицательное")
else:
print("Ноль")
-3
Отрицательное
Пример: чётное или нечётное
Пример: диапазон
Что можно писать в условии
В Java в if (...) должно быть строго boolean.
В C++ в условии можно написать и bool, и число: 0 – ложь, ненулевое – истина.
В Python можно писать True/False, сравнения, а также использовать «истинность» значений (например, 0 считается ложью). В задачах обычно удобнее писать сравнения.
Как выглядит блок кода
В Java и C++ блоки задаются фигурными скобками { ... }.
В Python блоки задаются отступами.
Ключевые слова
Java: if, else if, else.
C++: if, else if, else.
Python: if, elif, else.
Логические операции
Java и C++: &&, ||, !.
Python: and, or, not.
Частая ошибка в C++
В условии легко перепутать == (сравнение) и = (присваивание). В if нужно сравнение.