1. Giriş
Gəlin məişət analoqu ilə başlayaq. Təsəvvür edin ki, resept var:
Unu, yumurtaları və şəkəri qarışdırın, çırpın, yağı əlavə edin, bir də çırpın.
Qəribə görünür? İndi isə təsəvvür edin ki, “çırpın” və “əlavə edin” sözlərinin arasında vergül və ya mötərizə var. Addımların ardıcıllığı dərhal daha aydın olur.
Proqramlaşdırmada oxşar vəziyyət mürəkkəb ifadə yazanda yarana bilər:
boolean result = a > 0 && b < 10 || c == 3;
Sıra necədir? Əvvəl nə hesablanır: a > 0 && b < 10, sonra || c == 3? Yoxsa tam əksi?
Hesablamaların dəqiq qaydası olmadan kompüter “inqrediyentləri qarışdıra” bilər və nəticəniz gözlənilməz olar.
2. Java-da operatorların prioriteti
Java (çoxu proqramlaşdırma dilləri kimi) operatorların prioritetləri üçün müəyyən bir cədvəldə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ın (şərti ifadələr üçün):
| Operator | Təsvir | Prioritet |
|---|---|---|
|
Mötərizələr | ən yüksək |
|
Məntiqi “NOT” | yüksək |
|
Bərabərdir / bərabər deyil | orta |
|
Müqayisələr | orta |
|
Məntiqi “VƏ” | aşağı |
|
Məntiqi “VƏ YA” | daha aşağı |
(Hələ bir də riyazi operatorlar var — onların prioriteti məntiqi operatorlardan daha yüksəkdir.)
Əsas qayda
“VƏ” (&&) operatorlarının prioriteti “VƏ YA” (||) operatorlarından daha yüksəkdir,
yəni əvvəl “VƏ”, sonra “VƏ YA” hesablanır. Təsadüfi deyil ki, VƏ — məntiqi vurmadır, VƏ YA — toplama.
Şərt prioritetlərinin hesablanmasının blok‑sxemi
graph LR
A["a > 0"] --&&--> B["b < 10"]
B --||--> C["c == 3"]
(Praktikada: a > 0 && b < 10 || c == 3 — əvvəl a > 0 && b < 10 hesablanır, sonra nəticə || vasitəsilə c == 3 ilə müqayisə olunur.)
3. Operatorların istiqaməti: soldan sağa və əksinə
Prioritetdən əlavə, daha bir anlayış var: assosiativlik.
Bu, eyni prioritetli operatorlar “yan-yana” dayandıqda hansı istiqamətdə hesablandıqlarını müəyyən edən qaydadır.
Nümunə:
boolean a = true, b = false, c = true;
boolean 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 edildikdə:
| Operator | Assosiativlik |
|---|---|
|
soldan sağa |
|
sağdan sola |
4. Mötərizələr — mürəkkəb şərtlərdə ən yaxşı dostunuz
Sehr (və xilas) burada başlayır. İfadə yazanda mötərizələr prioriteti dəyişir və kodunuzu daha anlaşılan və təhlükəsiz edir.
Nümunə 1 (mötərizəsiz):
// Biz belə istəyirik: "İstifadəçi yetkindirsə və vətəndaşdırsa, yaxud onun xüsusi keçidi varsa"
boolean isAdult = age >= 18;
boolean isCitizen = country.equals("Belarus");
boolean hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
System.out.println("Giriş icazəlidir!");
}
Java bunu belə hesablayır:
Əvvəlcə isAdult && isCitizen hesablanır, sonra nəticə hasPermit ilə || üzrə müqayisə olunur.
- Tutaq ki, isAdult = true, isCitizen = false, hasPermit = true
- isAdult && isCitizen → true && false → false
- false || true → true
Yəni şəxsin xüsusi keçidi varsa, hər halda buraxılacaq.
Xüsusi keçidi olmasa da, yetkin və vətəndaşdırsa — yenə də buraxılacaq.
Nümunə 2 (mötərizələrlə):
if (isAdult && (isCitizen || hasPermit))
{
System.out.println("Giriş icazəlidir!");
}
İndi proqram əvvəlcə isCitizen || hasPermit yoxlayır, sonra isə bu nəticəni isAdult ilə birlikdə.
Yəni siz yetkin olmalısınız və (ya vətəndaş, ya da xüsusi keçidi olan).
Mötərizələrdəki kiçik fərq — məntiqdə böyük fərq yaradır!
GO TO FULL VERSION