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 ivariabilei
x = 5; Expresie al cărei tip este același cu tipul xvariabilei

Ș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
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

În al doilea rând, dacă vrem, putem ignora rezultatul evaluării unei expresii.

Cod Cod în care ignorăm rezultatul:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

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-elsedeclaraț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-elsedeclaraț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-elsedeclaraț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-elsedeclaraț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");