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

Представьте развилку дороги с указателем: «Если жарко — налево, к реке. Иначе — направо, в парк». Вы читаете условие и выбираете одну дорогу, а по второй в этот раз не идёте.
До сих пор программы курса выполняли все свои инструкции подряд, сверху вниз. Но программе тоже нужны развилки: для жаркой погоды один ответ, для холодной — другой.
Такой выбор записывают инструкцией if. После неё в круглых скобках стоит условие, а в фигурных — код, который выполняется, только когда условие истинно:
int t = 20;
if (t > 30)
{
Console.WriteLine("hot");
}
else if (t > 15)
{
Console.WriteLine("warm"); // warm
}
else
{
Console.WriteLine("cold");
}Давайте разберём программу по шагам:
int t = 20;кладёт в переменнуюtтемпературу за окном.- Условие
t > 30ложно:20не больше30. Код в фигурных скобках под ним пропускается. - Условие
t > 15истинно, поэтому выполняется код подelse if, и программа выводитwarm. - До
elseдело не доходит: одна ветка уже выполнилась.
При t = 35 программа выведет hot. При t = -5 ложны оба условия, и сработает последняя часть: программа выведет cold.
Условие — значение типа bool
Условие — это выражение типа bool: его значение равно true или false. Обычно это сравнение вроде t > 30 или несколько сравнений, соединённых через && и ||:
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:
int age = 16;
string status = age >= 18 ? "adult" : "minor";
Console.WriteLine(status); // minorРазберём по шагам:
- Условие
age >= 18ложно:16меньше18. - Поэтому всё выражение равно второму значению,
"minor", и оно попадает вstatus. Console.WriteLine(status)выводитminor.
Оба значения должны подходить переменной слева. В status типа string можно выбрать одну из двух строк, а число вместо "minor" компилятор не примет.
if — инструкция: он решает, какой код выполнить. ?: — выражение: у него есть значение, и его можно сохранить в переменной или сразу передать в Console.WriteLine. Для трёх вариантов и больше понятнее цепочка if и else if.
Частая ошибка
После условия поставили точку с запятой:
int t = 10;
if (t > 30); // ✗
{
Console.WriteLine("hot");
}warning CS0642: Possible mistaken empty statementПрограмма компилируется с этим предупреждением и выводит hot, хотя 10 не больше 30. Сообщение значит: «возможно, пустая инструкция поставлена по ошибке».
Точка с запятой завершила if пустой инструкцией: при истинном условии if выполняет её и ничего не делает. Блок в фигурных скобках к if уже не относится и выполняется всегда. Уберите ; после (t > 30), и блок снова станет веткой.
Главное
ifвыполняет ветку, когда условие истинно, аelse— когда ложны все условия выше.- Цепочка
else ifпроверяет условия сверху вниз и выполняет только первую подходящую ветку. - Условие — значение типа
bool: число или строку C# условием не считает. - Условный оператор
условие ? a : bвыбирает одно из двух значений.