Вы уже понимаете, что операторы могут создавать свои блоки кода, которые образуют область видимости. Нам осталось малое – узнать об операторах, которые мы можем использовать.
В C# есть три условных оператора, которые нас сейчас интересуют: if-elseif-else, switch и тернарный оператор ?:. Первые и второй имеют как блочную, так и сокращённую форму (на самом деле она тоже образует блок), а третий имеет больше оператор выражений, хоть с помощью него и можно организовать полноценное ветвление программы.
Мы также можем найти другие операторы, которые имеют немного другое применение. Но обсуждать мы их не будем.
If
С помощью оператора if мы можем задать блок кода, который выполнится при соблюдении определённых условий. Его применение вы могли увидеть немного выше. Он состоит из двух основных элементов: выражения и инструкций.
Его суть крайне проста – если результат выражения true, то выполняется блок кода. Если нет, то он пропускается. Оператор if как и все блочные, не обрывают свой родительский блок, а только создают вариант возможных событий.
Проследите за примером.
Фрагмент 1.6
Random random = new Random();
Console.WriteLine(”Tier1”);
if(random.Next(0, 2) == 1)
{
Console.WriteLine(”Tier2”);
}
Console.WriteLine(”Tier3”);
В нём мы используем рандом при составление выражения оператора if, в результате каждого запуска программы мы будем видеть либо три сообщения либо два. Дело в том, что есть шанс, что не выполнится блок оператора, но точно будут выполнены операторы до и после.
If и логические операторы
Более точно оператор можно описать таким образом:
If( ВЫРАЖЕНИЕ )
{
ОПЕРАТОРЫ;
}
В качестве выражения могут выступать любые выражения, результатом которых будет bool. Простейшим случаем будет использование одного из операторов отношений. Как вы уже знаете, у нас в арсенале также есть ряд логических операторов, которые позволяют описывать более сложные выражения, нежели с использованием только операторов отношений.
Представим, что у нас есть небольшая игра, в которой персонаж перемещается по клеткам глобальной карты и при столкновение с врагом, перед боем, мы должны вывести шанс победы игрока над противником.
Фрагмент 1.7
int playerPositionX = 5;
int playerPositionY = 8;
int playerHealth = 100;
int playerDamagePerStep = 25;
int enemyPositionX = 5;
int enemyPositionY = 8;
int enemyHealth = 140;
int enemyDamagePerStep = 5;
if(playerPositionX == enemyPositionX && playerPositionY == enemyPositionY)
{
int playerStepsToDeath = playerHealth / enemyDamagePerStep;
int enemyStepsToDeath = enemyHealth / playerDamagePerStep;
if(playerStepsToDeath > enemyStepsToDeath)
{
Console.WriteLine("Вы скорее всего победите");
}
}
В первом операторе мы используем два оператора сравнения, результаты которых комбинируем с помощью логического И. В результате блок выполнится только, если мы стоим на одной клетке с противником.
Далее мы используем еще один оператор, который предсказывает сможет ли игрок победить противника, и если да, то выводит сообщение.
If-else-else if
Давайте представим, что мы хотим добавить в предыдущий пример условный “А что если нет?”. Допустим если игрок может выиграть, то мы выводим определенное сообщение. А что если нет? Ответ на этот вопрос мы можем дать с помощью оператора else.
Важно понять, что операторы после оператора if и в случае выполнения и в случае невыполнения всё равно выполняются. А вот операторы в блоке “А что если нет?” выполняются ТОЛЬКО ЕСЛИ if НЕ ВЫПОЛНЯЕТСЯ.
Например:
Фрагмент 1.8
string password = "QWERTY";
string input = Console.ReadLine();
if(input == password)
{
Console.WriteLine("Добро пожаловать!");
}
else
{
Console.WriteLine("Пароль не правильный!");
}
В данном случае мы используем оператор else (C# синоним “А что если нет?”), благодаря которому мы можем что-то сделать если пароль НЕ ПОДОШЕЛ. Я думаю, вы уже понимаете, что оператор else идёт рука об руку с оператором if и является его продолжением, нежели самостоятельным оператором.
Т.е вы не можете записать просто оператор else, перед ним должен идти if.
Иногда, нам нужно расширить наше “А что если нет, но при этом”.
Например:
Фрагмент 1.9
string password = "QWERTY";
string adminPassword = "ADMINRODIP";
string input = Console.ReadLine();
if(input == password)
{
Console.WriteLine("Добро пожаловать!");
}
else if(input == adminPassword)
{
Console.WriteLine("Включен административный режим!");
}
else
{
Console.WriteLine("Пароль не правильный!");
}
В данном примере, если не срабатывает основной оператор if, мы переходим к else if, который сработает, если в нем верное выражение. Оператор else if может быть сколько угодно, а также они могут оканчиваться единичным блоком else (а ещё его можно не делать).
Я предполагаю, у вас может возникнуть вопрос: “Какая разница между if-else if и двумя if?”. Ответ прост – два ифа могут выполняться друг за другом, а в случае c if-else if, блок else if выполнится, если не выполняется основной if.