Арифметичні операції
У C# використовується більшість операцій, які застосовуються і в інших мовах програмування. Операції являють собою певні дії над операндами - учасниками операції. Операндом може бути змінна або деяке значення (наприклад, число). Операції бувають унарними (виконуються над одним операндом), бінарними (виконуються над двома операндами) і тернарними (виконуються над трьома операндами). Розглянемо в сі типи операцій.
Бінарні арифметичні операції:
- +
Операція додавання двох чисел:
int x = 10
int z = x + 12; // 22
- -
Операція віднімання двох чисел:
int x = 10
int z = x - 6; // 4
- *
Операція множення двох чисел:
int x = 10
int z = x * 5; // 50
- /
операція ділення двох чисел:
int x = 10
int z = x / 5; // 2
double a = 10
double b = 3;
double c = a / b; // 3.33333333
При діленні зверніть увагу, що якщо обидва операнди є цілими числами, то результат також буде округлено до цілих:
double z = 10 / 4; //результат 2.
Незважаючи на те, що результат операції в кінцевому результаті поміщається у змінну типу double, що дозволяє зберегти дробову частину, але в самій операції беруть участь два літерали, які за замовчуванням трактуються як об'єкти типу int, тобто цілі числа, і результат також буде цілочисельним.
Щоб вийти з цієї ситуації, необхідно визначити літерали або змінні, що беруть участь в операції, як типи double або float:
double z = 10.0 / 4.0; //результат дорівнює 2.5
- %
Операція отримання остачі від цілочисельного ділення двох чисел:
double x = 10.0
double z = x % 4.0; //результат рівний 2.
Існує також ряд унарних операцій з одним операндом:
- ++
Операція інкременту
Інкремент може бути префіксним: ++x - спочатку значення змінної x збільшується на 1, а потім її значення повертається як результат операції.
А також існує постфіксний інкремент: x++ - спочатку повертається значення змінної x як результат операції, а потім до нього додається 1.
int x1 = 5;
int z1 = ++x1; // z1=6; x1=6
int x2 = 5
int z2 = x2++; // z2=5; x2=6
- --
Операція декременту, або зменшення значення на одиницю. Існує префіксна форма декременту (--x) та постфіксна форма (x--).
int x1 = 5;
int z1 = --x1; // z1=4; x1=4
int x2 = 5
int z2 = x2--; // z2=5; x2=4
При виконанні декількох арифметичних операцій одночасно слід враховувати порядок їх виконання. Розставимо пріоритети операцій від найбільшого до найменшого:
-
Інкремент, декремент
-
Множення, ділення, отримання залишку
-
Додавання, віднімання
Дужки використовуються для зміни порядку виконання операцій.
Розглянемо набір операцій:
int a = 3
int b = 5
int c = 40
int d = c---b*a; // a=3 b=5 c=39 d=25
Тут ми маємо справу з трьома операціями: декремент, віднімання та множення. Спочатку відбувається декремент змінної c, потім множення b*a і, нарешті, віднімання. Таким чином, фактично набір операцій виглядає наступним чином:
int d = (c--)-(b*a);
Але за допомогою круглих дужок можна було б змінити порядок операцій, наприклад, наступним чином:
int a = 3;
int b = 5;
int c = 40;
int d = (c-(--b))*a; // a=3 b=4 c=40 d=108
Асоціативність операторів
Як зазначалося вище, операції множення і ділення мають однаковий пріоритет, але що тоді є результатом у виразі:
int x = 10 / 5 * 2;
Чи слід розглядати цей вираз як (10 / 5) * 2 або як 10 / (5 * 2)? Тому що в залежності від інтерпретації ми отримаємо різні результати.
Коли операції мають однаковий пріоритет, порядок обчислень визначається асоціативністю операторів. Існує два типи операторів в залежності від асоціативності:
Лівоасоціативні оператори, які виконуються зліва направо
Правоасоціативні оператори, які виконуються справа наліво
Всі арифметичні оператори є лівоасоціативними, тобто виконуються зліва направо. Тому вираз 10 / 5 * 2 слід інтерпретувати як (10 / 5) * 2, тобто результат дорівнює 4.
Translated with DeepL.com (free version)