У овом упутству ћемо научити о првенству оператора и асоцијативности у Ц #. Ово ће нам дати идеју о томе како компајлер Ц # процењује израз.
Предност оператора Ц #
Приоритет оператора је скуп правила који дефинише како се израз процењује. У Ц #, сваки Ц # оператор има додељени приоритет и на основу тих приоритета, израз се процењује.
На пример , приоритет (*)
оператора множења већи је од приоритета (+)
оператора сабирања . Стога се операција која укључује множење изводи пре сабирања.
Погледајте изјаву у наставку.
инт к = 4 + 3 * 5;
Колика ће бити вредност к након извршавања ове изјаве?
Операнд 3
је повезан са +
и *
. Као што је раније речено, множење има већи приоритет од сабирања. Дакле, операција 3 * 5
се изводи уместо 4 + 3
. Вредност променљиве к биће 19
.
Ако би сабирање имало већи приоритет, 4 + 3
прво би се процењивало, а вредност к би била 35
.
Табела приоритета оператора
Што је већи приоритет оператора, то се већи појављује у табели
Предност оператора Ц #Категорија | Оператори |
---|---|
Постфик повећање и смањење | ++, - |
Префикс Инкремент, Декремент и Унари | ++, -, +, -,!, ~ |
Мултипликативни | *, /,% |
Адитив | +, - |
Смена | <> |
Релацијски | <,,> = |
Једнакост | ==,! = |
У битовима И. | & |
Битно КСОР | ^ |
У битовима ИЛИ | |. | |
Логично И | && |
Логично ИЛИ | || |
Тернари | ? : |
Задатак | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Оператори доделе имају најмањи приоритет, док оператори повећања и смањења постфикса имају највећи приоритет.
Пример 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 Нетачно
Хајде да разумемо како се израз оцењује у програму.
Приоритет --
и ++
је већи од *
, а приоритет од *
је већи од -
. Отуда изјава,
резултат1 = --а * б - ++ ц;
је еквивалентно са
резултат1 = ((--а) * б) - (++ ц);
Израз унутар заграда увек се прво процењује без обзира на приоритет оператора изван њега.
- У почетку се (--а) вреднује као резултат у
4
. - Тада се (++ ц) процењује резултујући у
5
. - Сада се (а * б) процењује резултирајући у
24
. - На крају, врши се одузимање резултујући у
19
. - Отуда ће бити коначна вредност резултата1
19
.
У следећем изразу приоритет +
је већи од >=
. Дакле, прво се додају ц и а и збир се упоређује са б да би се добило false
.
Асоцијативност оператора у Ц #
У претходном одељку смо разговарали о предности оператора. Ако се користе два оператора са различитим приоритетом, прво се процењује оператор са већим приоритетом.
Али шта ако оба оператора имају исти приоритет?
У том случају, израз се процењује на основу асоцијативности оператора (слева надесно или здесна налево).
На пример:
инт а = 5, б = 6, ц = 3; инт резултат = а * б / ц;
Овде, како *
и /
имају исти приоритет. Али пошто је асоцијативност ових оператора слева надесно , a * b
прво се процењује, а затим се врши подела. Коначни резултат овог израза биће 10
.
У овом конкретном примеру, асоцијативност заправо није битна. Јер чак и кад би се дељење вршило пре множења, то не би утицало на резултат.
Погледајмо још један пример.
инт а = 5, б = 6, ц = 3; а = б = ц;
Асоцијативност =
оператора је здесна налево . Дакле, вредност ц (тј. 3
) Је додељена б, а затим је вредност б додељена а. Дакле, након извршавања ове изјаве, вредности а, б и ц ће бити 3
.
Табела испод приказује асоцијативност Ц # оператора:
Ц # Асоцијативност оператораКатегорија | Оператори | Асоцијативност |
---|---|---|
Постфик повећање и смањење | ++, - | С лева надесно |
Префикс Инкремент, Декремент и Унари | ++, -, +, -,!, ~ | Десна на лево |
Мултипликативни | *, /,% | С лева надесно |
Адитив | +, - | С лева надесно |
Смена | <> | С лева надесно |
Релацијски | <,,> = | С лева надесно |
Једнакост | ==,! = | С лева надесно |
У битовима И. | & | С лева надесно |
Битно КСОР | ^ | С лева надесно |
У битовима ИЛИ | |. | | С лева надесно |
Логично И | && | С лева надесно |
Логично ИЛИ | || | С лева надесно |
Тернари | ? : | Десна на лево |
Задатак | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Десна на лево |
Готово сви оператери имају асоцијативност с лева на десно. Оператори који имају асоцијативност здесна налево су:
- Унарни оператори
- Оператори повећања и смањења префикса
- Тернарни оператер
- Оператори доделе
Пример 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 а = 3, б = 3, ц = 3