C# Operator Precedence (Öncəlik) və Associativity (Assosiatilvik)

Aqil
Pragmatech
Published in
4 min readJul 18, 2022

Bu dərsdə biz operatorlar ilə edilən əməliyyatlarda öncəlik və assosiativlik qaydalarını öyrənəcəyik.

C# Operator Precedence (Öncəlik)

Operator öncəliyi dedikdə ifadələrin necə verilən ifadələrin necə qiymətləndirildiyini təyin edən qaydalar toplusu başa düşülür. C# proqramlaşdırma dilində bütün operatorlar əhəmiyyətlidir, lakin precedence məntiqində bir sıralama vardır. Gəlin buna nəzər yetirək.

Məsələn, vurma əməliyyat operatoru toplama operatoru ilə müqayisədə daha sıralamada daha əvvəl edilir. Nümunəyə nəzər salaq.

int x = 4 + 3 * 5 ;

Burda 3 operandı + və * operatorları ilə bağlantılıdır. Əvvəl də qeyd olunduğu kimi vurma əməliyyatı öndə icra ediləcəkdir. Beləliklə nümunədə 4+3 ifadəsinin əvəzinə 3*5 ifadəsi ilkin olaraq hesablanacaqdır. Yekunda x dəyişəninin alacağı total dəyər 19 olacaqdır.

Operator Precedence Table

Postfix artırma və azaltma operatorları sıralamada daha üstün olduğu halda təyinat operatorları daha az üstünlüyə malikdirlər.

Nümunə 1 :

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);

Proqram çalışdırldıqda aşağıdakı nəticə verəcəkdir :

19
False

Gəlin proqramlaşdırmada ifadələrin necə qiymətləndirildiyini anlamağa çalışaq.

Nümunədə ++ və — operatorlarının üstünlük dərəcəsi * operatoru ilə müqayisədə daha çoxdur və öz növbəsində * operatoru da — operatorundan daha üstündür.
Beləliklə, result1 = — a * b — ++c; ifadəsi *result1 = (( — a)b)-(++c); ifadəsi ilə ekvivalentdir. Mörtərizə içərisindəki ifadələr operator üstünlük dərəcə qaydalarından aslı olmyaraq daha əvvəl hesablanır.

Birinci addımda, ( — a) opratoru 4 nəticəsini alır.

Sonra isə, (++c) operatoru 5 nəticəsini verir.

Beləliklə, (a * b) ifadəsi bizə 24 nəticəsini verir.

Yekunda, çıxma əməliyyatı nəticəsində 19 ədədi alınır.

Beləliklə result1 — in dəyəri 19 olacaqdır.

Növbəti nümunədəki sıralamada isə + operatoru >= ilə müqayisədə daha üstün olacaqdır. Beləliklə, c+a ifadəsi birinci hesablanacaqdır və yekunda cəmin dəyəri b operatorundan >= olmadığı üçün false nəticəsi ekrana veriləcəkdir.

2. Operatorlarda assosiativlik məntiqi

Əvvəlki dərsdə biz operatorların öncəlilik dərəcəsini öyrənmiş olduq. Yəni, fərqli üstünlük dərəcəsində olan operatorları icra edərkən biz daha üstün olanını birinci icra etmiş olduq. Lakin belə bir sual meydana çıxır ki, ya hər bir operator eyni dərəcədə üstünlüyə malik olarsa?

Assosiativlik məntiqində iki prinsip üzrə hesablama baş tutur.

  • Left to right (soldan sağa)
  • Right to left (sağdan sola)

Nümunə :

int a = 5, b = 6, c = 3;
int result = a * b / c;

Burda * və / operatorlarının hər ikisi eyni dərəcəli üstünlüyə malikdirlər. Lakin, left to right məntiqinə əsaslanraq a * b əməliyatı birinci bölmə əməliyyatı isə ikinci addım olaraq hesablanacaqdır. Yekun nəticə bizə 10 ədədini verəcəkdir.

Bu nümunədə assosiativlik məntiqi əhəmiyyət daşımır, çünki, bölmə əməliyyatı daha əvvəl icra edilsəydi belə nəticə dəyişməyəcəkdi.

Digər nümunəyə nəzər salaq :

int a = 5, b = 6, c = 3;
a = b = c;

Burda isə = operatorunun assosiativlik məntiqi right to left yəni sağdan sola doğru qiymətləndirilir. Beləliklə, ilkin olaraq c-nin dəyəri b-yə, b-nin dəyəri isə a-ya təyin edilmiş olur. Yekunda bu yazı execute edildikdə a, b və c-nin dəyəri 3 olacaqdır.

Aşağıdakı cədvəldə c# operatorlarının assosiativlik məlumatları göstərilmişdir.

Demək olar ki, bütün operatorlarda assosiativlik məntiqi left to right prinsipi ilə aparılır.Yalnız, aşağıdakı hallarda right to left məntiqi tətbiq olunur :

  • Unary operatorlarda
  • Prefix artım və azalmalarda
  • Ternary operatorlarda
  • Təyinat operatorlarında

Nümunə

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);

Proqram çalışdırıldıqda output aşağıdakı kimi olacaqdır.

10
a = 3, b = 3, c = 3

--

--