Кожна мова програмування використовує оператори, через яких ми можемо виконувати різні дії над даними. Розглянемо оператори в C# і спробуємо розібратися для чого вони потрібні і як вони використовуються.
Що таке оператор?
Після того, як ми дізналися, як оголошувати і встановлювати змінні ми розповімо про те, як виконувати різні операції з ними. Для цієї мети ми будемо знайомитися з операторами.
Оператори дозволяють обробляти прості типи даних і об'єкти. Вони отримують в якості вхідного один або більше операндів і повертають деяке значення як результат.
Оператори в C# є спеціальними символами (такі як "+", ".", "^", і т. д.) і вони виконують перетворення над одним, двома або трьома операндами. Прикладами операторів C# є математичні знаки додавання, віднімання, множення і ділення (+, -, *, /) і відповідні операції, які вони виконують на цілими і дійсними числами.
Оператори в C#
Оператори в C# можна поділити на декілька різних категорій:
- Арифметичні оператори – так як і в математиці, служать для виконання простих арифметичних операцій.
- Оператори присвоювання – дозволяють присвоювання значень змінних.
- Оператори порівняння – дають можливість порівняти два літерала та/або змінних.
- Логічні оператори – оператори для роботи з логічними типами даних та логічними виразами.
- Побітові (бітові) оператори використовуються для виконання операцій на двійковим представлення числових даних.
- Оператори перетворення типів – дозволяють перетворення даних з одного типу в інший.
Категорії операторів
Далі подано список операторів за категоріями:
Категорії
|
Оператори
|
Арифметичні
|
-, +, *, /, %
|
Інкремент (декремент)
|
++, --
|
Логічні
|
&&, ||, !, ^
|
Бітові
|
&, |, ^, ~, <<, >>
|
Порівняння
|
==,!=, >, <, >=, <=
|
Присвоєння
|
=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
|
Об’єднання рядків
|
+ (конкатенація)
|
Перетворення типів
|
(type), as, is, typeof, sizeof
|
Індексні, лямбда-числення, інші
|
[],=>,., new, (), [], ?:, ??
|
Класифікація операторів за числу аргументів
Оператори також поділяються за числом аргументів
Тип оператора (число аргументів)
|
Приклади
|
Первинні (постфіксні)
|
Math.Abs(x)-виклик методу
|
Унарний, один
|
-x, y++, !x
|
Бінарний, два
|
x+y, x>y, x&&y
|
Тернарний, три
|
(a>b) ? c : d
|
Усі бінарні оператори в C# є лівоасоціативним, тобто вирази обчислюються зліва направо, за винятком операторів присвоювання. Всі оператори присвоювання та умовні оператори ?: і ?? є правоасоціативними, тобто вирази обчислюються справа наліво. Унарні оператори не є асоціативними.
В залежності від типів даних, над якими виконується дія, знаки операторів мають різний сенс. Класичним прикладом у цьому випадку є оператори + та /.
Приклад
double result = (2+3)/2;
string greetings = "Hello ";
string company = "Microsoft!";
Console.WriteLine("{0} {1}", result, greetings + company );
У цьому прикладі знак + виконує додавання для чисел і конкатенацію для рядків, а знак / виконує цілочисельне ділення і результат буде 2, а не 2.5.
Приорітет операцій у C#
Деякі оператори мають перевагу (пріоритет) над іншими. Наприклад, в математиці множення має пріоритет над додаванням. Оператори з вищим пріоритетом обчислюються раніше тих, що мають нижчий пріоритет. Оператор () використовується, щоб змінити пріоритет, і, як в математиці, його вміст обчислюється в першу чергу.
У наступній таблиці подано пріоритети операцій від найвищого до найнижчого:
Категорія
|
Оператори
|
Первинні
|
x.y f(x) a[x] x++ x-- new typeof checked unchecked |
Унарні
|
+ - ! ~ ++x --x (T)x |
Мультиплікативні
|
* / % |
Аддитивні
|
+ - |
Зсуву
|
<< >> |
Відношення і визначення типу
|
< > <= >= is as |
Рівності
|
== != |
Логічне AND
|
& |
Логічне XOR
|
^ |
Логічне OR
|
| |
Умовне AND
|
&& |
Умовне OR
|
|| |
Умовне
|
?: |
Присвоєння
|
= *= /= %= += -= <<= >>= &= ^= |= |
Оператори, розташовані у верхній частині таблиці, мають вищий пріоритет, ніж ті, що подно нижче, і, відповідно, вони мають перевагу в обчисленні виразу. Щоб змінити пріоритет оператора ми можемо використовувати дужки.
Арифметичні оператори.
Арифметичні оператори в C# +, -, * такі ж, як у математиці. Вони виконують додавання, віднімання та множення числових значень і результат також числове значення.
Оператор ділення має різний вплив на цілі і дійсні числа. Коли ми ділимо ціле на ціле число (наприклад, int, long і sbyte) результуюче значення є також цілим числом (без округлення дробової частини). Нагадаємо, що таке ділення називається цілочисельним. Приклад цілочисельного ділення: 7 / 3 = 2.
Цілочисельне ділення на 0 не допускається і призводить до виникнення виняткової ситуації під час виконання програми (runtime exception) DivideByZeroException. Остачу від ділення цілих чисел можна отримати оператором %.
Наприклад, 7 % 3 = 1, і -10 % 2 = 0.
При діленні двох дійсних чисел або двох чисел, одне з яких є дійсним (наприклад, float, double, і т. д.), результат буде дійсним числом з цілою і дробовою частиною. Наприклад: 5.0 / 2 = 2.5. У діапазоні дійсних чисел допускається ділення на 0.0 і відповідно результат +∞ (нескінченність), -∞ (нескінченності) або NaN (неприпустиме значення, Not a Number).
Оператор інкременту ++ додає одиницю до значення змінної, відповідно оператор декременту -- віднімає одиницю значення. Для даних операторів існує префіксна і постфіксна (суфіксна) форма.
Коли ми використовуємо оператори ++ і – як префікс, то спочатку обчислюється нове значення, а потім повертається результат. При постфіксній(суфіксній) формі спочатку повертається початкове значення операнда, а потім виконуєтся дія додавання або віднімання.
Приклад.
namespace ConsoleProgram
{
class Program
{
static void Main(string[] args)
{
double totalCost = 120;
int quantityOfBooks = 50;
double averageBookPrice = totalCost / quantityOfBooks;
double halfOfTotalCost = 1/2 * totalCost;
Console.WriteLine(averageBookPrice); // 2.5
Console.WriteLine(halfOfTotalCost); // 0
halfOfTotalCost = totalCost * 1 / 2 ;
Console.WriteLine(halfOfTotalCost); // 60
int numberA = 12;
int numberB = 5;
Console.WriteLine(numberA + numberB); // 17
Console.WriteLine(numberA + (numberB++)); // 17
Console.WriteLine(numberA + numberB); // 18
Console.WriteLine(numberA + (++numberB)); // 19
Console.WriteLine(numberA + numberB); // 19
Console.WriteLine(24 / numberA); // 2
Console.WriteLine(24 % numberB); // 4
numberA = 1;
numberB = 0;
// Console.WriteLine(one / zero); // DivideByZeroException
double zero = 0.0;
Console.WriteLine("{0} / {1} = {2}", zero, zero, zero / zero);
double dZero = 0.0;
Console.WriteLine(-1.0 / zero); // -Infinity
Console.WriteLine(1.0 / dZero); // Infinity
}
}