Глиф Учебники

Урок 4. Условия — if, else и switch

Курс «C#» · урок 4 из 10 · 4 минуты чтения

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

Сравнения

Сравнение даёт логическое значение bool — true или false:

ЗаписьЗначит
a == bравно (два знака =)
a != bне равно
a < b, a > bменьше, больше
a <= b, a >= bменьше или равно, больше или равно

Один знак = — это присваивание, два == — сравнение. Если перепутать их в условии, C# не скомпилирует программу: if (x = 5) даёт ошибку, а не тихо неверный результат.

if и else

C#
Console.Write("Введите число: ");
int n = int.Parse(Console.ReadLine() ?? "");

if (n > 0)
{
    Console.WriteLine("Положительное");
}
else if (n < 0)
{
    Console.WriteLine("Отрицательное");
}
else
{
    Console.WriteLine("Ноль");
}
Текст
Введите число: -7
Отрицательное

Выполняется только одна ветка — первая подходящая. Если в блоке одна команда, скобки можно опустить, но лучше всегда их ставить: так проще не ошибиться, когда в блок добавится вторая строка.

введено -7 n > 0 false нет n < 0 true да Отрицательное да Положительное нет else всё остальное Ноль
При вводе −7 условие n > 0 ложно, следующее условие n < 0 истинно, и выполняется только его ветка — до else дело не доходит.

Чётное или нечётное

Остаток от деления % часто стоит в условиях: число чётное, если остаток от деления на 2 равен нулю.

C#
int n = int.Parse(Console.ReadLine() ?? "");
if (n % 2 == 0)
{
    Console.WriteLine($"{n} — чётное");
}
else
{
    Console.WriteLine($"{n} — нечётное");
}
Ввод
14
Вывод
14 — чётное

Проверяйте именно n % 2 == 0 или n % 2 != 0. Условие n % 2 == 1 ошибается на отрицательных числах: у -3 % 2 остаток -1.

И, ИЛИ, НЕ

Условия соединяют логическими операторами:

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

if (age >= 12 && hasTicket)
{
    Console.WriteLine("Проходите");
}
if (age < 6 || age > 65)
{
    Console.WriteLine("Положена скидка");
}
if (!hasTicket)
{
    Console.WriteLine("Нужен билет");
}
Вывод
Проходите

&& и || проверяют вторую часть, только если без неё ответ ещё не ясен. Поэтому безопасно писать if (b != 0 && a / b > 2): при b == 0 деления не будет.

при age = 15 и hasTicket = true age >= 12 true && и hasTicket true true печатает «Проходите» age < 6 false || или age > 65 false false ветка не выполнится если b == 0 b != 0 false && и a / b > 2 не считается false деления на 0 не будет
Оператор && даёт true, только когда истинны обе части, || — когда истинна хотя бы одна, а если первая часть && уже ложна, вторая не вычисляется.

Проверку «число в диапазоне» удобно писать шаблоном (сравнением с образцом через is): if (n is >= 1 and <= 10) — то же, что if (n >= 1 && n <= 10).

Тернарный оператор

Когда нужно выбрать одно из двух значений, вместо if хватает записи условие ? если_да : если_нет. «Тернарный» значит «из трёх частей»: условие и два варианта.

C#
int a = 7;
int b = 12;
int max = a > b ? a : b;
string kind = max % 2 == 0 ? "чётное" : "нечётное";
Console.WriteLine($"Большее: {max}, {kind}");
Вывод
Большее: 12, чётное

switch

Если одну переменную сравнивают с несколькими конкретными значениями, удобнее switch:

C#
int day = int.Parse(Console.ReadLine() ?? "");
switch (day)
{
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        Console.WriteLine("Будний день");
        break;
    case 6:
    case 7:
        Console.WriteLine("Выходной");
        break;
    default:
        Console.WriteLine("Нет такого дня недели");
        break;
}
Ввод
6
Вывод
Выходной

switch работает и со строками: case "да":.

Выражение switch

Когда по значению нужно получить другое значение, есть короткая форма — выражение switch (появилось в C# 8, сравнения < и > в нём — в C# 9). В ней можно сравнивать не только на равенство:

C#
int t = int.Parse(Console.ReadLine() ?? "");
string weather = t switch
{
    < 0 => "мороз",
    < 10 => "холодно",
    < 20 => "прохладно",
    < 30 => "тепло",
    _ => "жарко"
};
Console.WriteLine(weather);
Ввод
15
Вывод
прохладно

Варианты проверяются сверху вниз, берётся первый подходящий: 15 не меньше 0 и не меньше 10, но меньше 20. _ — «всё остальное». Варианты разделяются запятыми, а после закрывающей скобки ставится ;.

варианты сверху вниз при t = 15 какие t сюда попадут < 0 => "мороз", 15 < 0 нет ниже 0 < 10 => "холодно", 15 < 10 нет 0 … 9 < 20 => "прохладно", 15 < 20 да 10 … 19 15 < 30 => "тепло", не проверяется _ => "жарко" не проверяется 20 … 29 30 и выше
Варианты выражения switch проверяются по порядку, поэтому каждому достаются свои значения t: при t = 15 срабатывает третий вариант, «прохладно».

Частые ошибки

Коротко

Проверьте себя

1. Что выведет программа?
C#
int x = 5;
if (x > 3)
{
    Console.WriteLine("A");
}
else if (x > 1)
{
    Console.WriteLine("B");
}
else
{
    Console.WriteLine("C");
}
2. Как проверить, что число n нечётное, чтобы проверка работала и для отрицательных?
3. Что будет, если в switch в конце блока case не написать break?
4. Чему равно t switch { < 0 => "мороз", < 10 => "холодно", _ => "тепло" } при t = -5?