Условные операторы – это конструкции, которые используют условные выражения для управления ходом выполнения программы.
Условный оператор if
Условный оператор if – используется в случаях, когда выполнение инструкции, или набора инструкций, зависит от некоторого логического выражения.
В языке C#, есть две формы условного оператора if: с неполным и полным ветвлением.
if с неполным ветвлением
Оператор с неполным ветвлением имеет следующий синтаксис:
if (условное_выражение)
инструкция;
Пример на языке C#:
int a = 0;
int b = 12;
if (a < b)
Console.WriteLine(a);
Для выполнения нескольких инструкция, необходимо взять их в операторные скобки:
double c = 8;
double d = 4;
if (d != 0)
{
var f = c / d;
Console.WriteLine(z);
}
if с полным ветвлением
В операторе if с полным ветвлением, дополнительно используется ключевое слово else:
int n = 8;
int m = 0;
if (m == 0)
{
Console.WriteLine("Делить на ноль нельзя!");
}
else
{
var r = n / m;
Console.WriteLine(r);
}
В оператор if, вместо инструкций можно вложить другие операторы ветвления, строя таким образом сложную логику работы приложения..
Пример использования оператора if
Рассмотрим задачу определения какой четверти координатной плоскости принадлежит точка с координатами (x, y). Будем считать, что точка не может лежать на осях.
Код программ для определения в какой четверти лежит заданная точка:
using System;
class Program
{
static void Main(string[] args)
{
Console.Write("x = ");
//читаем данные из консоли, и конвертируем их в int
int x = Convert.ToInt32(Console.ReadLine());
Console.Write("y = ");
int y = Convert.ToInt32(Console.ReadLine());
//переменная для хранения номера четверти
string q;
//код для проверки
if (y > 0)
{
if (x > 0)
q = "I";
else // x < 0
q = "II";
}
else // y < 0
{
if (x < 0)
q = "III";
else // x > 0
q = "IV";
}
Console.WriteLine($"Точка лежит в {q} четверти");
Console.ReadLine();
}
}
Тернарный условный оператор ?:
Тернарный оператор – единственный оператор языка С#, который работает сразу с тремя операндами, в зависимости от результата условия, которое задано в первом операнде, возвращает значение второго(если первый - true), или третьего(если первый - false) операнда. При этом второй и третий должны быть одинакового типа данных.
int a = 3;
int b = 4;
int m = a < b ? a : b; //m = a = 3
//аналог записи
if(a < b)
{
m = a;
}
else
{
m = b;
}
int n = a > b ? a : b; //n = b = 4
//аналог записи
if(a > b)
{
n = a;
}
else
{
n = b;
}
Тернарный оператор в качестве операндов может принимать другие тернарные операторы.
Если переписать код программы из предыдущего примера, с использованием тернарного оператора, то получим:
using System;
class Program
{
static void Main(string[] args)
{
Console.Write("x = ");
int x = Convert.ToInt32(Console.ReadLine());
Console.Write("y = ");
int y = Convert.ToInt32(Console.ReadLine());
string q = y > 0 ? (x > 0 ? "I" : "II") : (x < 0 ? "III" : "IV");
Console.WriteLine($"Точка лежит в {q} четверти");
Console.ReadLine();
}
}
Как можно видеть, вся логика работы программы уместилась в одну строку кода.
Условный оператор switch
Конструкция switch позволяет сравнивать значение выражения сразу с несколькими вариантами.
Рассмотрим код, который конвертирует оценку пятибалльной шкалы из числа в текстовое представление:
Console.Write("Введите оценку от 1 до 5: ");
var r = Convert.ToByte(Console.ReadLine());
string v;
if (r == 1 || r == 2)
{
v = "Неудовлетворительно";
}
else if (r == 3)
{
v = "Удовлетворительно";
}
else if (r == 4)
{
v = "Хорошо";
}
else if (r == 5)
{
v = "Отлично";
}
else
{
v = "Ошибка";
}
Console.WriteLine(v);
С использованием switch код будет выглядеть так:
switch (r)
{
case 1:
case 2:
v = "Неудовлетворительно"; //этот код выполняется когда r равен 1 или 2
break;
case 3:
v = "Удовлетворительно";
break;
case 4:
v = "Хорошо";
break;
case 5:
v = "Отлично";
break;
default:
v = "Ошибка";
break;
}
Выражение соответствия в скобках после switch, сравнивается с вариантами(метками), которые находяться за ключевым словом case. Если они эквивалентны, то выполняются инструкции до оператора break, который указывает на то, что нужно выйти из блока switch. В случае когда сравниваемое значение не соответствует ни одному из вариантов, выполняется блок default.
Для перехода с одного блока case в другой, можно использовать оператор goto case:
var s = "a";
var t = 1;
switch (s)
{
case "a":
t += 10;
goto case "c";
case "b":
t += 100;
break;
case "c":
t += 1000;
break;
}
// после выхода t = 1011;
Блок default не обязательный. Если он не указан, а соответствия нет, то происходит выход из switch.
Использование break после операторов return, throw и goto case не обязательное.
Начиная с C# версии 7.0, выражение соответствия может быть любым выражением отличным от null. В предыдущих версиях языка допускались только: целочисленные, символьные, строковые, логические типы данных и перечисления.