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 true
indiferent.
Î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 expression3
includ apeluri de metodă, aceste metode nu vor fi apelate !
Același lucru este valabil și pentru &&
operatorul logic:
(expression1) && (expression2) && (expression3)
Dacă expression1
este egal cu false
, nu are rost să evaluăm expression2
și expression3
: rezultatul va fi false
indiferent.
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.
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ă b
va fi 5
, nu 6
aș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, b
va 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.
GO TO FULL VERSION