Перейти к содержимому
Теория · Условия и циклы · урок 1 из 13

if и else

Чему вы научитесь

Чему вы научитесь:

  • выбирать, какой код выполнить, с помощью if, else if, else и условного оператора ?:;
  • делать выбор по значению инструкцией switch и выражением switch;
  • повторять код циклами while, do и for и управлять ими через break и continue;
  • читать вложенные циклы и объяснять, из какого цикла выходит break.
Развилка с указателем: табличка t > 30 и градусник, стрелка if налево к реке, стрелка else направо к скамейке

Представьте развилку дороги с указателем: «Если жарко — налево, к реке. Иначе — направо, в парк». Вы читаете условие и выбираете одну дорогу, а по второй в этот раз не идёте.

До сих пор программы курса выполняли все свои инструкции подряд, сверху вниз. Но программе тоже нужны развилки: для жаркой погоды один ответ, для холодной — другой.

Такой выбор записывают инструкцией if. После неё в круглых скобках стоит условие, а в фигурных — код, который выполняется, только когда условие истинно:

C#
int t = 20;

if (t > 30)
{
    Console.WriteLine("hot");
}
else if (t > 15)
{
    Console.WriteLine("warm"); // warm
}
else
{
    Console.WriteLine("cold");
}

Давайте разберём программу по шагам:

  1. int t = 20; кладёт в переменную t температуру за окном.
  2. Условие t > 30 ложно: 20 не больше 30. Код в фигурных скобках под ним пропускается.
  3. Условие t > 15 истинно, поэтому выполняется код под else if, и программа выводит warm.
  4. До else дело не доходит: одна ветка уже выполнилась.

При t = 35 программа выведет hot. При t = -5 ложны оба условия, и сработает последняя часть: программа выведет cold.

Условие — значение типа bool

Условие — это выражение типа bool: его значение равно true или false. Обычно это сравнение вроде t > 30 или несколько сравнений, соединённых через && и ||:

C#
int age = 20;
bool hasTicket = true;

if (age >= 18 && hasTicket)
{
    Console.WriteLine("Welcome"); // Welcome
}

Здесь age >= 18 истинно и hasTicket равно true, поэтому всё условие истинно, и программа выводит Welcome. Если бы билета не было, программа не вывела бы ничего: у этого if нет else, и при ложном условии блок пропускается целиком.

Число или строка условием быть не могут. Код if (t) не скомпилируется: C# не превращает int в bool сам. Нужно написать сравнение, например if (t != 0).

По той же причине не скомпилируется и опечатка if (t = 30). Как вы помните из урока о сравнении, одиночный = — присваивание, и значение t = 30 — число 30, а не bool.

Три вида веток

Код в фигурных скобках после if, else if или else называют веткой. В первом примере их три, и у каждой своя роль.

Ветка if

Ветка if открывает развилку. Конструкция if состоит из трёх частей:

  • ключевое слово if;
  • условие в круглых скобках, например (t > 30);
  • блок в фигурных скобках, который выполняется, когда условие истинно.

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

Ветка else if

Ветка else if добавляет к развилке ещё одно условие. Таких веток между if и else может быть сколько угодно.

Условия проверяются сверху вниз, и выполняется только первая ветка с истинным условием. При t = 35 верны и t > 30, и t > 15, но программа выведет только hot.

Порядок веток важен. Если поменять местами ветки с t > 30 и t > 15, при t = 35 программа выведет warm: первым истинным окажется условие t > 15. Более строгое условие ставят выше.

Здесь аналогия с дорогой перестаёт работать. Путник может прочитать все указатели и выбрать самый подходящий. Программа идёт по первому указателю с истинным условием, а остальные уже не читает.

Ветка else

У ветки else нет условия. Она выполняется, когда ложны все условия выше, и всегда стоит последней.

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

Условный оператор ?:

Иногда нужно выбрать не код, а значение: одну из двух строк или одно из двух чисел. Для этого есть условный оператор ?:. Его ещё называют тернарным, потому что у него три части: условие ? a : b. Если условие истинно, всё выражение равно a, иначе — b:

C#
int age = 16;
string status = age >= 18 ? "adult" : "minor";

Console.WriteLine(status); // minor

Разберём по шагам:

  1. Условие age >= 18 ложно: 16 меньше 18.
  2. Поэтому всё выражение равно второму значению, "minor", и оно попадает в status.
  3. Console.WriteLine(status) выводит minor.

Оба значения должны подходить переменной слева. В status типа string можно выбрать одну из двух строк, а число вместо "minor" компилятор не примет.

if — инструкция: он решает, какой код выполнить. ?: — выражение: у него есть значение, и его можно сохранить в переменной или сразу передать в Console.WriteLine. Для трёх вариантов и больше понятнее цепочка if и else if.

Частая ошибка

После условия поставили точку с запятой:

C#
int t = 10;

if (t > 30); // ✗
{
    Console.WriteLine("hot");
}
TEXT
warning CS0642: Possible mistaken empty statement

Программа компилируется с этим предупреждением и выводит hot, хотя 10 не больше 30. Сообщение значит: «возможно, пустая инструкция поставлена по ошибке».

Точка с запятой завершила if пустой инструкцией: при истинном условии if выполняет её и ничего не делает. Блок в фигурных скобках к if уже не относится и выполняется всегда. Уберите ; после (t > 30), и блок снова станет веткой.

Главное

  • if выполняет ветку, когда условие истинно, а else — когда ложны все условия выше.
  • Цепочка else if проверяет условия сверху вниз и выполняет только первую подходящую ветку.
  • Условие — значение типа bool: число или строку C# условием не считает.
  • Условный оператор условие ? a : b выбирает одно из двух значений.