Перейти до основного вмісту

Арифметичні операції

У 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

При виконанні декількох арифметичних операцій одночасно слід враховувати порядок їх виконання. Розставимо пріоритети операцій від найбільшого до найменшого:

  1. Інкремент, декремент

  2. Множення, ділення, отримання залишку

  3. Додавання, віднімання

Дужки використовуються для зміни порядку виконання операцій.

Розглянемо набір операцій:

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)