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, а не 6Howто си мислите на пръв поглед.

Ако ++операторът е преди променливата и променливата е част от ня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;

За --оператора всичко е абсолютно същото.