JavaRush /Курсы /C# SELF /Вложенные if, многоуровневая логика

Вложенные if, многоуровневая логика

C# SELF
3 уровень , 2 лекция
Открыта

1. Базовый синтаксис вложенного if

В реальной жизни редко встретишь ситуацию, когда решение принимается только по одному критерию. Обычно приходится проверять сразу несколько условий, и они часто зависят друг от друга. Например, чтобы попасть на концерт, недостаточно быть просто взрослым — иногда нужно быть еще и в списке приглашённых. Вот тут на сцену выходит так называемая многоуровневая логика, и помогают нам в этом вложенные операторы if.

Вложенные условия — это когда один if живет внутри другого. Представьте себе коробку в коробке: если первая коробка открылась (условие выполнилось), тогда смотрим, что внутри и, возможно, открываем вторую. С точки зрения кода и логики это очень мощный инструмент.

Начнём с простого:

if (условиеА)
{
    // действия, если условиеА — true (истина)
    if (условиеБ)
    {
        // действия, если оба условия истинны
    }
}
Вложенный if внутри другого if

Если вам это напоминает матрёшку — вы всё понимаете правильно! Вложенный if внутри внешнего будет выполняться только если внешний сработал.

Пример: проход в клуб

Давайте разовьем наше учебное приложение, где пользователь ранее вводил имя и возраст. Теперь добавим второй уровень проверки: допустим, чтобы попасть в закрытый клуб, нужно быть старше 21 года и иметь пригласительный код.

Console.Write("Введите ваше имя: ");
string name = Console.ReadLine();

Console.Write("Введите ваш возраст: ");
int age = int.Parse(Console.ReadLine());

if (age >= 21)
{
    Console.Write("Введите пригласительный код: ");
    string code = Console.ReadLine();

    if (code == "VIP2024")
    {
        Console.WriteLine("Добро пожаловать, " + name + ", в VIP-клуб!");
    }
    else
    {
        Console.WriteLine("Извините, неверный код. Доступ запрещён.");
    }
}
else
{
    Console.WriteLine("Извините, вход только с 21 года!");
}

Обратите внимание: внутренний if проверяет код только если возраст уже прошёл проверку. Это экономит ресурсы (и не нервирует охранника).

2. Сколько уровней вложенности допустимо?

Технически, сколько угодно. Но по факту — чем больше вложенных уровней, тем сложнее читать и поддерживать такой код. На практике редко используют вложенность больше 2-3 уровней. Если возникают ситуации с «лесенками» из 4 и более вложенных if, стоит задуматься: возможно, есть способ упростить логику или вынести часть проверки в отдельные функции (а это тема отдельной лекции!).

3. Вложенные if и else: ловушки и нюансы

Ошибка новичков: небрежное оформление фигурных скобок.

Когда вы пишете вложенные условия, особенно при использовании else, C# строго следует правилам синтаксиса. Если не добавить фигурные скобки {}, то к if или else относится только первая строка после них. Это частый источник досадных багов.

Пример с потенциальной ошибкой:

if (age >= 21)
    if (code == "VIP2024")
        Console.WriteLine("Добро пожаловать!");
else
    Console.WriteLine("Неверный код.");

Многие ожидают, что else относится к проверке возраста, но на самом деле оно относится к ближайшему перед ним if (проверке кода приглашения). Из-за этого сообщения могут показываться не так, как ожидалось. Лучше всегда использовать скобки — даже если внутри только одна строка!

Чтобы не было недопонимания, покажу еще раз. Компилятор воспринимает код выше вот так:

if (age >= 21)
{    
    if (code == "VIP2024")
        Console.WriteLine("Добро пожаловать!");
else
    Console.WriteLine("Неверный код.");
}    

Важно! Еще раз:
Если в конструкции if-else не расставлены фигурные скобки, else относится к предыдущему (ближайшему к нему) if-у.

4. Альтернативы: else if во вложенных условиях

Иногда внутри внешнего if хочется не только проверить одно дополнительное условие, но и предусмотреть альтернативу. Например, если пригласительный код не подошёл, можно предложить купить билет. Это делается вложенной конструкцией else if/else:

if (age >= 21)
{
    Console.Write("Введите пригласительный код: ");
    string code = Console.ReadLine();

    if (code == "VIP2024")
    {
        Console.WriteLine("Добро пожаловать в клуб!");
    }
    else if (code == "GUEST")
    {
        Console.WriteLine("Гостевой режим: доступ только до 23:00.");
    }
    else
    {
        Console.WriteLine("Увы, доступ невозможен.");
    }
}
else
{
    Console.WriteLine("Вход только с 21 года.");
}

В этом примере мы сделали вложенный выбор между тремя сценариями: VIP-код, гостевой код и отказ.

5. Практика: калькулятор скидки с многоуровневой логикой

Давайте напишем такое приложение: пользователю начисляется скидка в магазине на основе возраста и наличия клубной карты.

  • Если возраст пользователя больше или равен 60 — скидка 15%.
  • Если возраст меньше, но у пользователя есть клубная карта — скидка 7%.
  • В остальных случаях скидки нет.

Как это оформить?

Console.Write("Введите ваш возраст: ");
int age = int.Parse(Console.ReadLine());

double discount = 0.0;

if (age >= 60)
{
    discount = 0.15;
}
else
{
    Console.Write("Есть ли у вас клубная карта (да/нет)? ");
    string hasCard = Console.ReadLine();

    if (hasCard == "да")
    {
        discount = 0.07;
    }
}

Console.WriteLine("Ваша скидка: " + (discount * 100) + "%");

Здесь мы использовали вложенный if внутри ветки else. Если возраст не подошёл, только тогда спрашиваем про карту.

2
Задача
C# SELF, 3 уровень, 2 лекция
Недоступна
Проверка возраста для аттракциона
Проверка возраста для аттракциона
2
Задача
C# SELF, 3 уровень, 2 лекция
Недоступна
Расчёт стоимости билета
Расчёт стоимости билета
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Mark Marchenko Уровень 27
4 января 2026
В задаче "Расчёт стоимости билета" есть скрытые условия. В прошлых задачах подразумевалось, что пользователь вводит правильные данные, а тут уже нужно учитывать, что пользователь может ввести что-то другое. Этот скачок в требованиях нигде не описан.
mr Arkmaster Уровень 11
16 декабря 2025
Это как
Дмитрий Уровень 2
6 ноября 2025
Тут уже конечно надо чуть подумать!