1. Giriş
Gəlin gündəlik bir analojiya ilə başlayaq. Təsəvvür elə bir resept var:
Unu, yumurtanı və şəkəri qarışdırın çalın yağı əlavə edin yenə çalın.
Qəribə görünür? İndi təsəvvür elə ki, "çalın" və "əlavə edin" sözlərinin arasında vergül və ya mötərizə var. Hərəkətlərin ardıcıllığı dərhal daha aydın olur.
Proqramlaşdırmada da oxşar vəziyyət yaranır, sən mürəkkəb ifadə yazanda:
bool result = a > 0 && b < 10 || c == 3;
Hansının ardıcıllığı? Birinci nə hesablanır: a > 0 && b < 10, sonra || c == 3? Yoxsa tam tərsi? Hesablamaların dəqiq ardıcıllığı olmadan kompüter "inqrediyentləri qarışdıra" bilər və nəticə gözlənilməz olar.
2. C#-da operatorların prioriteti
C# (əksər proqramlaşdırma dilləri kimi) operatorların prioritet cədvəlindən istifadə edir.
Yüksək prioritetli operatorlar aşağı prioritetlilərdən əvvəl icra olunur.
Bu cədvəlin ən vacib hissəsinə bax (şərt ifadələri üçün):
| Operator | Təsviri | Prioritet |
|---|---|---|
| () | Mötərizələr | ən yüksək |
| ! | Loji "YOX" | yüksək |
| ==, != | Bərabərdir / bərabər deyil | orta |
| <, >, <=, >= | Müqayisələr | orta |
| && | Loji "VƏ" | aşağı |
| || | Loji "YAXUD" | daha da aşağı |
(Hələ arifmetik operatorlar da var — onlar loji operatorlardan daha yüksək prioritetə malikdir.)
Əsas qayda
"VƏ" (&&) operatorunun prioriteti "YAXUD" (||)-dan yüksəkdir,
yəni əvvəlcə "VƏ", sonra "YAXUD" hesablanacaq.
Şərt prioritetinin hesablanma blok-sxemi
Praktikada: a > 0 && b < 10 || c == 3 — əvvəl a > 0 && b < 10 hesablanır, sonra nəticə c == 3 ilə || vasitəsilə müqayisə olunur.
3. Operatorların istiqaməti: soldan sağa və əksinə
Prioritetdən əlavə, bir də belə bir söz var: assosiativlik.
Bu qayda göstərir ki, eyni prioritetli operatorlar "yanaşı" olanda hansı istiqamətdə hesablanır.
Nümunə:
bool a = true, b = false, c = true;
bool result = a && b && c;
Sual: necə hesablanacaq?
Cavab: && üçün assosiativlik — soldan sağa.
Deməli, əvvəl a && b, sonra nəticə c ilə.
Şərtlərə tətbiq edəndə:
| Operator | Assosiativlik |
|---|---|
| &&, || | soldan sağa |
| ! | sağdan sola |
4. Mötərizələr — mürəkkəb şərtlərdə ən yaxşı dostun
Burada artıq magiya (və xilas) başlayır. Sən ifadə yazanda mötərizələr prioriteti dəyişir və kodunu daha aydın və təhlükəsiz edir.
Nümunə 1 (mötərizəsiz):
// Biz istəyirik: "Əgər istifadəçi böyüklərdirsə və vətəndaşdırsa, ya da onun xüsusi icazəsi varsa"
bool isAdult = age >= 18;
bool isCitizen = country == "Belarus";
bool hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
Console.WriteLine("Giriş icazəlidir!");
}
C# necə hesablayır:
Əvvəlcə isAdult && isCitizen hesablanır, sonra nəticə || ilə hasPermit ilə müqayisə olunur.
- Tutaq ki, isAdult = true, isCitizen = false, hasPermit = true
isAdult && isCitizen→true && false→falsefalse || true→true
Yəni, əgər adamda xüsusi icazə varsa, yenə də buraxılacaq.
Əgər xüsusi icazə yoxdursa, amma böyüklər və vətəndaşdırsa — yenə də buraxılacaq.
Nümunə 2 (mötərizələrlə):
if (isAdult && (isCitizen || hasPermit))
{
Console.WriteLine("Giriş icazəlidir!");
}
İndi proqram əvvəlcə yoxlayır:
isCitizen || hasPermit, sonra bu nəticəni isAdult ilə birlikdə.
Yəni sən böyüklər olmalısan və (ya vətəndaş, ya da xüsusi icazə sahibi).
Mötərizədə kiçik fərq — məntiqdə böyük fərq!
GO TO FULL VERSION