Умовні оператори – це конструкції, які використовують умовні вирази для керування ходом виконання програми.
Умовний оператор 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. В попередніх версіях мови, допускалися тільки: цілочислові, символьні, рядкові, логічні типи.