1. Boolean əməliyyatları
|
və &
operatorlarını yalnız rəqəmlərə deyil, həm də boolean tipli ifadələrə tətbiq etmək olar.
Lakin, artıq bildiyiniz kimi, məntiqi ifadələr üçün &&
və ||
operatorları mövcuddur. Bəs |
yerinə ||
və &
yerinə &&
istifadə etməyin bizə nə kimi faydası ola bilər? Ümumiyyətlə, bunun bir mənası varmı? Məlum olur ki, bəzən var.
Məntiqi operatorlar ||
və &&
verilmiş ifadələri tənbəl prinsip adlanan yanaşma ilə soldan sağa doğru həll edir.
(ifadə1) || (ifadə2) || (ifadə3)
Əgər ifadə1
true
olarsa, ifadə2
və ifadə3
-ü hesablamanın bir mənası yoxdur: nəticə yenə də true
olacaq.
Buna görə də ifadələr hesablanarkən (özü də sırayla soldan sağa doğru), biz true
aldığımız anda, qalan ifadələrin hesablanması atlanır. Əgər ifadələrdə ifadə2
və ifadə3
, hər hansısa funksiya çağırışları varsa, bu funksiyalar çağırılmır!
Eyni şey məntiqi &&
operatoru üçün də keçərlidir:
(ifadə1) && (ifadə2) && (ifadə3)
Əgər ifadə1
false
olarsa, ifadə2
və ifadə3
-ü hesablamanın mənası yoxdur: nəticə yenə də false
olacaq.
Bu vacib məqam, aşağıdakı növ yazıları gündəmə gətirir:
String s = null;
if (s != null && s.length() > 0) {
Yuxarıdakı nümunədə biz heç vaxt NullPointerException ilə qarşılaşmayacağıq, çünki s.length()
ifadəsi yalnız birinci hissə s != null
true
olduqda yerinə yetiriləcək.
Əgər s
null
olarsa, &&
operatorunun sol tərəfində false
dəyəri olacaq və bütün məntiqi ifadənin nəticəsi false
olacaq. Buna görə də ikinci hissənin (s.length() > 0
) hesablanması baş verməyəcək.
Əgər məntiqi ifadədə |
və ya &
operatoru istifadə olunarsa, tənbəl hesablama baş verməyəcək — hər bir halda bütün ifadələr hesablanacaq.
2. Java-da əməliyyatların prioriteti
Məktəb riyaziyyat dərslərindən xatırladığınız kimi, vurma əməliyyatı toplama əməliyyatından daha yüksək prioritetə malikdir. Amma mötərizələr daha yüksək prioritetə malikdir: əvvəlcə mötərizədəki ifadələr hesablanır, sonra vurma/bölmə və toplama/çıxma.
Java-da operatorların da öz prioriteti var. Sadəcə: a) operatorlar daha çoxdur, b) bəzi operatorların əməliyyatları soldan sağa, digərləri isə sağdan sola icra olunur.
Java operatorlarının tam cədvəli belə görünür:
Kateqoriya | Operator | Assosiativlik |
---|---|---|
Postfix | () [] . |
Soldan sağa |
Unary | ++ -- ! ~ |
Sağdan sola |
Müxtəliflik | * / % |
Soldan sağa |
Toplama-çıxma | + - |
Soldan sağa |
Shift | >> >>> << |
Soldan sağa |
Müqayisə | > >= < <= |
Soldan sağa |
Bərabərlik | == != |
Soldan sağa |
Bitwise VƏ (AND) |
& |
Soldan sağa |
Exclusive YAXUD (XOR) |
^ |
Soldan sağa |
Bitwise YAXUD (OR) |
| |
Soldan sağa |
Lojiq VƏ (AND) |
&& |
Soldan sağa |
Lojiq YAXUD (OR) |
|| |
Soldan sağa |
Şərtli | ?: |
Sağdan sola |
Təyin | = += -= *= /= %= >>= <<= &= ^= |= |
Sağdan sola |
Vergül | , |
Soldan sağa |
Cədvəlin yuxarı sətrində ən prioritet operatorlar yerləşir. Dairəvi mötərizələr ()
prioriteti göstərmək üçün istifadə olunur. Kvadrat mötərizələr []
array dəyişəninin indeksləşdirilməsi üçün istifadə olunur. .
operatoru obyekt və ya sinif referansından sahələr və metodlar əldə etmək üçün istifadə olunur.
Cədvəldə aşağıda olan operatorların prioriteti daha aşağıdır.
Əgər ifadənizdə bir neçə operator istifadə edirsinizsə, tənbəllik etməyin: mötərizələrdən istifadə edin.
Bəli, Java-da if (a & 1<<b > ~c)
kimi bir şey yazmaq olar, amma belə etməyin. Kodu təkcə kompilyator üçün deyil, həm də digər proqramçılar üçün yazırsınız. Kod nə qədər oxunaqlı olsa, bir o qədər yaxşıdır.
3. Prefiks və postfiks inkrement
Artıq bildiyiniz kimi, Java-da dəyəri 1
artıran inkrement operatoru (++
) və 1
azaldan dekrement operatoru (--
) mövcuddur.
Bilmədiyiniz bir şey isə odur ki, bu əməliyyatların iki növü var: prefiks – operator dəyişəndən əvvəl yazılır, və postfiks — operator dəyişəndən sonra yazılır. Bu operatorlar bir az fərqli işləyir.
Java-da bu kimi ifadə yaza bilərsiniz:
int a = 5;
int b = a++;
Əgər ++
operatoru dəyişəndən sonra gəlirsə və dəyişən hər hansı ifadədə iştirak edirsə (yuxarıdakı nümunədə olduğu kimi), ifadədə dəyişənin cari dəyəri istifadə olunacaq, yalnız sonra bu dəyər 1
artırılacaq.
Başqa sözlə, bu təxminən belə olacaq:
int a = 5;
int b = a;
a = a + 1;
Yəni, b
-nin dəyəri 5
olacaq, 6
deyil, əvvəlcə düşündüyünüz kimi.
Əgər ++
operatoru dəyişəndən əvvəl yazılıbsa və dəyişən hər hansı ifadədə iştirak edirsə, əvvəlcə dəyər 1
artırılacaq, yalnız sonra ifadədə iştirak edəcək.
int a = 5;
int b = ++a;
Yuxarıdakı nümunə aşağıdakı nümunəyə ekvivalentdir:
int a = 5;
a = a + 1;
int b = a;
Burada artıq b
-nin dəyəri 6
olacaq.
Hətta bir nümunə var ki, Java proqramçıları onu istifadə edir, onların qarşısındakı şəxsin də Java proqramçısı olduğunu müəyyən etmək üçün:
int a = 5;
int b = ++a + ++a;
Bəli, bu şəkildə də yazmaq olar.
Bu nümunə mükəmməl şəkildə kompilyasiya olunacaq və təxminən belə olacaq:
int a = 5;
a = a + 1;
int v1 = a;
a = a + 1;
int v2 = a;
int b = v1 + v2;
--
operatoru üçün də hər şey dəqiq eynidir.
GO TO FULL VERSION