1. Expresii vs enunţuri
În Java, este util să se facă distincția între două categorii: instrucțiuni și expresii . De obicei se spune că o instrucțiune este executată , în timp ce o expresie este evaluată . Dar asta nu este cel mai important lucru.
Principala diferență dintre o declarație și o expresie este că evaluarea unei expresii are un rezultat . Și acest rezultat are un tip și poate fi atribuit unei variabile sau utilizat într-o altă expresie.
Exemple:
Cod | Note |
---|---|
int x; |
Afirmație |
(a < 10) |
Expresie al cărei tip esteboolean |
i++; |
Expresie al cărei tip este același cu tipul i variabilei |
x = 5; |
Expresie al cărei tip este același cu tipul x variabilei |
Și ce ne oferă asta?
În primul rând, putem profita de faptul că multe afirmații sunt de fapt expresii (adică se evaluează la o valoare). De exemplu, un cod ca acesta va funcționa:
Cod | Note |
---|---|
|
|
În al doilea rând, dacă vrem, putem ignora rezultatul evaluării unei expresii.
Cod | Cod în care ignorăm rezultatul: |
---|---|
|
|
Ignorăm rezultatul evaluării unei expresii, de exemplu, dacă expresia implică a face ceva util, iar această acțiune este ceea ce este important pentru noi, nu rezultatul în sine.
2. Operator ternar
Acest truc de viață este deja mai interesant decât precedentul. Java are un operator ternar special . Sintaxa sa este oarecum similară cu sintaxa pentru instrucțiunea:if-else
Condition ? Expression 1 : Expression 2;
Dacă condiția este adevărată, atunci expresia 1 este evaluată, în caz contrar, expresia 2 este evaluată. Condiția este urmată de un semn de întrebare , iar cele două expresii sunt separate prin două puncte .
Principala diferență dintre operatorul ternar și o if-else
declarație este că operatorul ternar este o expresie, ceea ce înseamnă că putem atribui rezultatul lui ceva.
De exemplu, să presupunem că vrem să calculăm minimul de două numere. Folosind operatorul ternar, acest cod ar arăta astfel:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Sau, să presupunem că trebuie să atribuiți valori diferite unei variabile, în funcție de o anumită condiție. Cum faci asta?
O opțiune este să utilizați o if-else
declarație:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
A doua opțiune este să utilizați operatorul ternar , adică prescurtarea instrucțiunii if-else
:
int age = 25;
int money = age > 30 ? 100 : 50;
Deci, care este mai bine de utilizat - o if-else
declarație sau operatorul ternar ? În ceea ce privește viteza de execuție, nu există mare diferență. Aceasta este mai mult o chestiune de citire a codului. Și acesta este un punct foarte important: codul nu trebuie doar să funcționeze corect, ci și să fie ușor de citit pentru alți programatori.
Cea mai simplă regulă este următoarea: dacă codul se încadrează pe o linie , atunci utilizați operatorul ternar ; dar dacă nu se potrivește pe o singură linie, atunci este mai bine să folosiți o if-else
declarație.
3. Compararea numerelor reale
După cum am menționat mai devreme, nu puteți doar să luați numere reale și să le comparați. Există întotdeauna posibilitatea ca unele cifre semnificative să fie aruncate, provocând efecte secundare neașteptate.
De aceea există o abordare testată în timp. Dacă două numere reale diferă printr-o valoare foarte mică, atunci ele pot fi considerate egale. Exemplu:
double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
System.out.println("The numbers are equal");
else
System.out.println("The numbers are not equal");
Dar nu este tot ce trebuie să ne îngrijorăm, deoarece diferența dintre numere se poate dovedi negativă. Deci, pentru ca această abordare să funcționeze, trebuie să comparați nu doar diferența dintre numere, ci și valoarea absolută a diferenței dintre numere:|a-b|
Java are o metodă pentru calcularea valorii absolute a unui număr Math.abs()
:
int m = Math.abs(value);
Ca rezultat, versiunea corectată a exemplului nostru de mai sus va arăta astfel:
double a = 1.000001;
double b = 1.000002;
if ( Math.abs(b - a) < 0.0001 )
System.out.println("The numbers are equal");
else
System.out.println("The numbers are not equal");
GO TO FULL VERSION