1. Базовый синтаксис вложенного if
В реальной жизни редко встретишь ситуацию, когда решение принимается только по одному критерию. Обычно приходится проверять сразу несколько условий, и они часто зависят друг от друга. Например, чтобы попасть на концерт, недостаточно быть просто взрослым — иногда нужно быть ещё и в списке приглашённых. Вот тут на сцену выходит так называемая многоуровневая логика, и помогают нам в этом вложенные операторы if.
Вложенные условия — это когда один if живёт внутри другого. Представьте себе коробку в коробке: если первая коробка открылась (условие выполнилось), тогда смотрим, что внутри и, возможно, открываем вторую. С точки зрения кода и логики это очень мощный инструмент.
Начнём с простого:
if (условиеА)
{
// действия, если условиеА — true (истина)
if (условиеБ)
{
// действия, если оба условия истинны
}
}
if внутри другого
if
Если вам это напоминает матрёшку — вы всё понимаете правильно! Вложенный if внутри внешнего будет выполняться только если внешний сработал.
Пример: проход в клуб
Давайте разовьём наше учебное приложение, где пользователь ранее вводил имя и возраст. Теперь добавим второй уровень проверки: допустим, чтобы попасть в закрытый клуб, нужно быть старше 21 года и иметь пригласительный код.
fun main() {
print("Введите ваше имя: ")
val name = readln()
print("Введите ваш возраст: ")
val age = readln().toInt()
if (age >= 21) {
print("Введите пригласительный код: ")
val code = readln()
if (code == "VIP2026") {
println("Добро пожаловать, $name, в VIP-клуб!")
} else {
println("Извините, неверный код. Доступ запрещён.")
}
} else {
println("Извините, вход только с 21 года!")
}
}
Обратите внимание: внутренний if проверяет код только если возраст уже прошёл проверку. Это экономит ресурсы (и не нервирует охранника).
2. Сколько уровней вложенности допустимо?
Технически — сколько угодно. Но по факту — чем больше вложенных уровней, тем сложнее читать и поддерживать такой код. На практике редко используют вложенность больше 2–3 уровней. Если возникают ситуации с «лесенками» из 4 и более вложенных if, стоит задуматься: возможно, есть способ упростить логику или вынести часть проверки в отдельные функции (а это тема отдельной лекции!).
3. Вложенные if и else: ловушки и нюансы
Ошибка новичков: небрежное оформление фигурных скобок.
Когда вы пишете вложенные условия, особенно при использовании else, Kotlin строго следует правилам синтаксиса. Если не добавить фигурные скобки {}, то к if или else относится только первая строка после них. Это частый источник досадных багов.
Пример с потенциальной ошибкой:
if (age >= 21)
if (code == "VIP2026")
println("Добро пожаловать!");
else
println("Неверный код.");
Многие ожидают, что else относится к проверке возраста, но на самом деле оно относится к ближайшему перед ним if (проверке кода приглашения). Из-за этого сообщения могут показываться не так, как ожидалось. Лучше всегда использовать скобки — даже если внутри только одна строка!
Чтобы не было недопонимания, покажу ещё раз. Компилятор воспринимает код выше вот так:
if (age >= 21)
{
if (code == "VIP2026")
println("Добро пожаловать!");
else
println("Неверный код.");
}
Важно! Ещё раз: Если в конструкции if-else не расставлены фигурные скобки, else относится к предыдущему (ближайшему к нему) if-у.
4. Альтернативы: else if во вложенных условиях
Иногда внутри внешнего if хочется не только проверить одно дополнительное условие, но и предусмотреть альтернативу. Например, если пригласительный код не подошёл, можно предложить купить билет. Это делается вложенной конструкцией else if/else:
fun main() {
print("Введите ваш возраст: ")
val age = readln().toInt()
if (age >= 21) {
print("Введите пригласительный код: ")
val code = readln()
if (code == "VIP2026") {
println("Добро пожаловать в клуб!")
} else if (code == "GUEST") {
println("Гостевой режим: доступ только до 23:00.")
} else {
println("Увы, доступ невозможен.")
}
} else {
println("Вход только с 21 года.")
}
}
В этом примере мы сделали вложенный выбор между тремя сценариями: VIP-код, гостевой код и отказ.
5. Практика: калькулятор скидки с многоуровневой логикой
Давайте напишем такое приложение: пользователю начисляется скидка в магазине на основе возраста и наличия клубной карты.
- Если возраст пользователя больше или равен 60 — скидка 15%.
- Если возраст меньше, но у пользователя есть клубная карта — скидка 7%.
- В остальных случаях скидки нет.
Как это оформить?
fun main() {
print("Введите ваш возраст: ")
val age = readln().toInt()
var discount = 0.0
if (age >= 60) {
discount = 0.15
} else {
print("Есть ли у вас клубная карта (да/нет)? ")
val hasCard = readln()
if (hasCard == "да") {
discount = 0.07
}
}
println("Ваша скидка: ${discount * 100}%")
}
Здесь мы использовали вложенный if внутри ветки else. Если возраст не подошёл, только тогда спрашиваем про карту.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ