У цьому підручнику ми дізнаємось про перевагу операторів та асоціативність у C #. Це дасть нам уявлення про те, як оцінюється вираз компілятором C #.
Перевага оператора C #
Пріоритет оператора - це набір правил, який визначає, як оцінюється вираз. У C # кожному оператору C # присвоєно пріоритет, і на основі цих пріоритетів вираз обчислюється.
Наприклад , пріоритет (*)
оператора множення вищий, ніж пріоритет (+)
оператора додавання . Тому операція, що передбачає множення, проводиться перед додаванням.
Погляньте на твердження нижче.
int x = 4 + 3 * 5;
Яким буде значення x після виконання цього твердження?
Операнд 3
асоціюється з +
і *
. Як зазначалося раніше, множення має вищий пріоритет, ніж додавання. Отже, операція 3 * 5
проводиться замість 4 + 3
. Значення змінної x буде 19
.
Якщо складання буде мати більш високий пріоритет, 4 + 3
буде оцінюватися першим і значення х буде 35
.
Таблиця переваги оператора
Чим вищий пріоритет оператора, тим вищий він відображається в таблиці
Перевага оператора C #Категорія | Оператори |
---|---|
Постфікс збільшення та зменшення | ++, - |
Префікс Інкремент, Декремент та Унарний | ++, -, +, -,!, ~ |
Мультиплікативний | *, /,% |
Добавка | +, - |
Shift | <> |
Реляційні | <,,> = |
Рівність | ==,! = |
Побітове І | & |
Побітовий XOR | ^ |
Побітове АБО | | |
Логічне І | && |
Логічне АБО | || |
Трійковий | ? : |
Призначення | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Оператори присвоєння мають найнижчий пріоритет, тоді як оператори збільшення та зменшення постфіксу мають найвищий пріоритет.
Приклад 1: Перевага оператора
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int result1; int a = 5, b = 6, c = 4; result1 = --a * b - ++c; Console.WriteLine(result1); bool result2; result2 = b>= c + a; Console.WriteLine(result2); ) ) )
Коли ми запускаємо програму, результат буде:
19 Невірно
Давайте розберемося, як оцінюється вираз у програмі.
Пріоритет --
і ++
вище *
, а пріоритет *
- вищий ніж -
. Звідси твердження,
result1 = --a * b - ++ c;
еквівалентно
result1 = ((--a) * b) - (++ c);
Вираз у дужках завжди обчислюється спочатку незалежно від того, який пріоритет має оператори поза ним.
- Спочатку (--a) обчислюється в результаті
4
. - Потім (++ c) обчислюється в результаті
5
. - Тепер (a * b) обчислюється в результаті
24
. - Нарешті, віднімання проводиться в результаті в
19
. - Отже, буде остаточне значення результату1
19
.
У наступному виразі пріоритет +
вище ніж >=
. Отже, c та a додаються спочатку, а сума порівнюється з b, щоб отримати false
.
Асоціативність операторів в C #
У попередньому розділі ми обговорювали перевагу оператора. Якщо використовуються два оператори з різним пріоритетом, спочатку оцінюється оператор з вищим пріоритетом.
Але що, якщо обидва оператори мають однаковий пріоритет?
У такому випадку вираз обчислюється на основі асоціативності оператора (зліва направо або справа наліво).
Наприклад:
int a = 5, b = 6, c = 3; int результат = a * b / c;
Тут обидва *
і /
мають однаковий пріоритет. Але оскільки асоціативність цих операторів знаходиться зліва направо , a * b
спочатку оцінюється, а потім проводиться поділ. Кінцевим результатом цього виразу буде 10
.
У цьому конкретному прикладі асоціативність насправді не має значення. Тому що навіть якби ділення проводилося до множення, результат не змінився б.
Давайте подивимось на інший приклад.
int a = 5, b = 6, c = 3; a = b = c;
Асоціативність =
оператора - справа наліво . Отже, значення c (тобто 3
) присвоюється b, а потім значення b присвоюється a. Отже, після виконання цього твердження значення a, b і c будуть 3
.
У таблиці нижче показано асоціативність операторів C #:
C # Асоціативність операторівКатегорія | Оператори | Асоціативність |
---|---|---|
Постфікс збільшення та зменшення | ++, - | Зліва направо |
Префікс Інкремент, Декремент та Унарний | ++, -, +, -,!, ~ | Право наліво |
Мультиплікативний | *, /,% | Зліва направо |
Добавка | +, - | Зліва направо |
Shift | <> | Зліва направо |
Реляційні | <,,> = | Зліва направо |
Рівність | ==,! = | Зліва направо |
Побітове І | & | Зліва направо |
Побітовий XOR | ^ | Зліва направо |
Побітове АБО | | | Зліва направо |
Логічне І | && | Зліва направо |
Логічне АБО | || | Зліва направо |
Трійковий | ? : | Право наліво |
Призначення | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Право наліво |
Майже всі оператори мають асоціативність зліва направо. Операторами, що мають асоціативність справа наліво, є:
- Одинарні оператори
- Оператори збільшення та префікса префікса
- Тернарний оператор
- Оператори присвоєння
Приклад 2: Асоціативність операторів
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int a = 5, b = 6, c = 3; int result = a * b / c; Console.WriteLine(result); a = b = c; Console.WriteLine("a = (0), b = (1), c = (2)", a, b, c); ) ) )
Коли ми запускаємо програму, результат буде:
10 a = 3, b = 3, c = 3