1. Operații booleene

Operatorii |și &pot fi aplicați nu numai numerelor, ci și expresiilor booleene.

Dar, după cum știți deja, există &&și ||operatori. De ce am folosi |în loc de ||și &în loc de &&? Are vreun rost asta? Se pare că există. Uneori.

Operatorii logici ||și &&sunt executați de la stânga la dreapta după așa-numitul principiu leneș .

(expression1) || (expression2) || (expression3)

Dacă expression1 este egal cu true, nu are rost să evaluăm expression2 și expression3: rezultatul va fi trueindiferent.

În consecință, la evaluarea expresiilor (acestea sunt evaluate de la stânga la dreapta), de îndată ce obținem true, evaluarea restului expresiilor este omisă . Și dacă expression2 și expression3includ apeluri de metodă, aceste metode nu vor fi apelate !

Același lucru este valabil și pentru &&operatorul logic:

(expression1) && (expression2) && (expression3)

Dacă expression1este egal cu false, nu are rost să evaluăm expression2și expression3: rezultatul va fi falseindiferent.

This is an important fact that lets you write things like:

String s = null;
if (s != null && s.length() > 0) {

The example above will never get you a NullPointerException, because s.length() will only be executed if the first part s! = null is true.

If s is equal to null, the part to the left of the && operator is false, then the result of the whole boolean expression is false, so the part to the right (s.length() > 0) is not evaluated.

All that to say:

If you use the | operator or the & operator, then there is no lazy evaluation: each subexpression will always be evaluated.



2. Operation precedence in Java

As you probably remember from your high school math class, the multiplication operator has higher precedence than the addition operator. Parentheses have an even higher precedence: expressions in parentheses are evaluated first, then multiplication and division, and then addition and subtraction.

Operators in Java also have a order of precedence. The difference is that a) there are slightly more of them, b) for some operators, the operands are evaluated from left to right, while for others — from right to left.

Iată un tabel cu toți operatorii Java:

Categorie Operator Asociativ
Postfix () [] . De la stanga la dreapta
Unar ++ -- ! ~ De la dreapta la stanga
Multiplicativ * / % De la stanga la dreapta
Aditiv + - De la stanga la dreapta
Schimbare >> >>> << De la stanga la dreapta
Relațional > >= < <= De la stanga la dreapta
Egalitatea == != De la stanga la dreapta
Pe bitAND & De la stanga la dreapta
Exclusive OR(XOR) ^ De la stanga la dreapta
Pe bitOR | De la stanga la dreapta
LogicAND && De la stanga la dreapta
LogicOR || De la stanga la dreapta
Condiţional ?: De la dreapta la stanga
Misiune = += -= *= /= %= >>= <<= &= ^= |= De la dreapta la stanga
Virgulă , De la stanga la dreapta

Linia de sus conține operatorii cu cea mai mare prioritate. Parantezele ()sunt folosite pentru a seta în mod explicit prioritatea. Parantezele pătrate []sunt folosite pentru a accesa un element la un index specific al unei variabile matrice. Operatorul punct ( .) este folosit pentru a accesa câmpuri și metode folosind o referință la un obiect sau o clasă.

Cu cât operatorii sunt mai jos în tabel, cu atât este mai mică prioritatea lor.

Dacă folosiți mai mulți operatori într-o expresie, nu fi leneș: adăugați paranteze.

In Java, you can write something like if (a & 1<< b > ~c), but you shouldn't. You're writing code not only for the compiler, but also for other programmers. The more readable the code, the better.



3. Prefix and postfix increment

As you already know, Java has an increment operator (++) and a decrement operator (--). Respectively, they increase and decrease the value of a variable by 1.

Ceea ce probabil nu știți este că există două tipuri de acești operatori: prefix (operatorul este plasat înaintea variabilei) și postfix (operatorul este plasat după variabilă). Și două tipuri de operatori funcționează puțin diferit.

În Java, puteți scrie o expresie ca aceasta:

int a = 5;
int b = a++;

Dacă ++operatorul apare după o variabilă și variabila face parte dintr-o expresie (ca în exemplul de mai sus), atunci expresia va folosi valoarea curentă a variabilei și numai după aceea variabila va fi mărită cu 1.

Cu alte cuvinte, ceva de genul acesta se va întâmpla:

int a = 5;
int b = a;
a = a + 1;

Adică bva fi 5, nu 6așa cum ai putea crede la prima vedere.

Dacă ++operatorul este înaintea variabilei și variabila face parte dintr-o expresie, aceasta va fi mai întâi mărită cu 1și numai după aceea valoarea sa va fi utilizată în expresie.

int a = 5;
int b = ++a;

Exemplul de mai sus este echivalent cu următorul exemplu:

int a = 5;
a = a + 1;
int b = a;

Aici, bva fi egal cu 6.

Există chiar și un exemplu folosit de programatorii Java pentru a determina dacă altcineva este și programator Java:

int a = 5;
int b = ++a++a;

Da, poți să scrii și asta.

Acest exemplu se va compila foarte bine și se va transforma în ceva de genul acesta:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

Pentru --operator, totul este exact la fel.