1. Булеви операции
Операторите |
and &
могат да се прилагат не само към числа, но и към булеви изрази.
Но, Howто вече знаете, има &&
и ||
оператори. Защо бихме използвали |
instead of ||
и &
instead of &&
? Има ли смисъл от това? Изглежда, че има. Понякога.
Логическите оператори ||
и &&
се изпълняват отляво надясно, следвайки така наречения мързелив принцип .
(expression1) || (expression2) || (expression3)
Ако expression1
е равно на true
, няма смисъл да се оценява expression2
и expression3
: резултатът ще бъде true
без meaning.
Съответно, когато оценяваме изрази (те се изчисляват отляво надясно), веднага щом получим true
, оценката на останалите изрази се пропуска . И ако expression2
и expression3
включват извиквания на метод, тези методи няма да бъдат извикани !
Същото важи и за &&
логическия оператор:
(expression1) && (expression2) && (expression3)
Ако expression1
е равно на false
, няма смисъл да се оценява expression2
и expression3
: резултатът ще бъде false
без meaning.
Това е важен факт, който ви позволява да пишете неща като:
String s = null;
if (s != null && s.length() > 0) {
Примерът по-горе никога няма да ви даде NullPointerException , защото s.length()
ще бъде изпълнен само ако първата част s! = null
е true
.
Ако s
е равно на null
, частта отляво на &&
оператора е false
, тогава резултатът от целия булев израз е false
, така че частта отдясно ( s.length() > 0
) не се оценява.
Ако използвате |
оператора or &
оператора, тогава няма мързелива оценка : всеки подизраз винаги ще бъде оценяван.
2. Приоритет на операциите в Java
Както вероятно си спомняте от часовете по математика в гимназията, операторът за умножение има по-висок приоритет от оператора за събиране. Скобите имат още по-висок приоритет: първо се оценяват изразите в скоби, след това умножението и делението, а след това събирането и изваждането.
Операторите в Java също имат ред на приоритет. Разликата е, че а) има малко повече от тях, б) за някои оператори операндите се изчисляват отляво надясно, докато за други — отдясно наляво.
Ето table с всички Java оператори:
Категория | Оператор | Асоциативен |
---|---|---|
Постфикс | () [] . |
От ляво на дясно |
Единичен | ++ -- ! ~ |
От дясно на ляво |
Мултипликативен | * / % |
От ляво на дясно |
Добавка | + - |
От ляво на дясно |
Преместване | >> >>> << |
От ляво на дясно |
Релационни | > >= < <= |
От ляво на дясно |
Равенство | == != |
От ляво на дясно |
ПобитовоAND |
& |
От ляво на дясно |
Exclusive OR (XOR) |
^ |
От ляво на дясно |
ПобитовоOR |
| |
От ляво на дясно |
ЛогичноAND |
&& |
От ляво на дясно |
ЛогичноOR |
|| |
От ляво на дясно |
Условно | ?: |
От дясно на ляво |
Възлагане | = += -= *= /= %= >>= <<= &= ^= |= |
От дясно на ляво |
Запетая | , |
От ляво на дясно |
Горният ред съдържа операторите с най-висок приоритет. Скобите ()
се използват за изрично задаване на приоритета. Квадратните скоби []
се използват за достъп до елемент при конкретен индекс на променлива на масив. Операторът точка ( .
) се използва за достъп до полета и методи чрез препратка към обект or клас.
Колкото по-надолу са операторите в tableта, толкова по-нисък е техният приоритет.
Ако използвате няколко оператора в израз, не бъдете мързеливи: добавете скоби.
В Java можете да напишете нещо като if (a & 1<< b > ~c)
, но не трябва. Вие пишете code не само за компилатора, но и за други програмисти. Колкото по-четлив е codeът, толкова по-добре.
3. Префиксно и постфиксално увеличение
Както вече знаете, Java има оператор за нарастване ( ++
) и оператор за намаляване ( --
). Съответно те увеличават и намаляват стойността на променлива с 1
.
Това, което вероятно не знаете е, че има два вида от тези оператори: префикс (операторът се поставя преди променливата) и постфикс (операторът се поставя след променливата). И два вида оператори работят малко по-различно.
В Java можете да напишете израз като този:
int a = 5;
int b = a++;
Ако ++
операторът се появи след променлива и променливата е част от няHowъв израз (Howто в примера по-горе), тогава изразът ще използва текущата стойност на променливата и едва след това променливата ще бъде увеличена с 1
.
С други думи, ще се случи нещо подобно:
int a = 5;
int b = a;
a = a + 1;
Тоест b
ще бъде 5
, а не 6
Howто си мислите на пръв поглед.
Ако ++
операторът е преди променливата и променливата е част от няHowъв израз, той първо ще бъде увеличен с 1
и едва след това стойността му ще бъде използвана в израза.
int a = 5;
int b = ++a;
Примерът по-горе е еквивалентен на следния пример:
int a = 5;
a = a + 1;
int b = a;
Тук b
ще бъде равно на 6
.
Има дори пример, използван от Java програмисти, за да определят дали някой друг също е Java програмист:
int a = 5;
int b = ++a + ++a;
Да, можете да напишете и това.
Този пример ще се компorра добре и ще се превърне в нещо подобно:
int a = 5;
a = a + 1;
int v1 = a;
a = a + 1;
int v2 = a;
int b = v1 + v2;
За --
оператора всичко е абсолютно същото.