1. Espressioni vs affermazioni

In Java, è utile distinguere tra due categorie: dichiarazioni ed espressioni . Di solito si dice che un'istruzione viene eseguita , mentre un'espressione viene valutata . Ma non è la cosa più importante.

La principale differenza tra un'istruzione e un'espressione è che la valutazione di un'espressione ha un risultato . E questo risultato ha un tipo e può essere assegnato a una variabile o utilizzato in qualche altra espressione.

Esempi:

Codice Appunti
int x; Dichiarazione
(a < 10) Espressione il cui tipo èboolean
i++; Espressione il cui tipo è uguale al tipo della ivariabile
x = 5; Espressione il cui tipo è uguale al tipo della xvariabile

E questo cosa ci dà?

Innanzitutto, possiamo trarre vantaggio dal fatto che molte affermazioni sono in realtà espressioni (nel senso che valutano un valore). Ad esempio, un codice come questo funzionerà:

Codice Appunti
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

In secondo luogo, se vogliamo, possiamo ignorare il risultato della valutazione di un'espressione.

Codice Codice in cui ignoriamo il risultato:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

Ignoriamo il risultato della valutazione di un'espressione, ad esempio, se l'espressione implica fare qualcosa di utile, e questa azione è ciò che è importante per noi, non il risultato stesso.


2. Operatore ternario

Questo life hack è già più interessante del precedente. Java ha uno speciale operatore ternario . La sua sintassi è in qualche modo simile alla sintassi dell'istruzione :if-else

Condition ? Expression 1 : Expression 2;

Se la condizione è vera, viene valutata l'Espressione 1 , altrimenti viene valutata l'Espressione 2 . La condizione è seguita da un punto interrogativo e le due espressioni sono separate da due punti .

La principale differenza tra l' operatore ternario e un'affermazione if-elseè che l'operatore ternario è un'espressione, il che significa che possiamo assegnare il suo risultato a qualcosa.

Ad esempio, supponiamo di voler calcolare il minimo di due numeri. Usando l'operatore ternario, questo codice sarebbe simile a questo:

int a = 2;
int b = 3;
int min = a < b ?  a : b;

Oppure, diciamo che devi assegnare valori diversi a una variabile a seconda di alcune condizioni. Come si fa a farlo?

Un'opzione è usare un'istruzione if-else:

int age = 25;
int money;
if (age > 30)
   money = 100;
else
   money = 50;

La seconda opzione consiste nell'utilizzare l' operatore ternario , ovvero l'abbreviazione dell'affermazione if-else:

int age = 25;
int money = age > 30 ? 100 : 50;

Quindi quale è meglio usare: un'istruzione if-elseo l' operatore ternario ? In termini di velocità di esecuzione, non c'è molta differenza. Questa è più una questione di leggibilità del codice. E questo è un punto molto importante: il codice non deve solo funzionare correttamente, ma anche essere facilmente leggibile da altri programmatori.

La regola più semplice è questa: se il codice sta su una riga , usa l' operatore ternario ; ma se non sta su una riga, allora è meglio usare un'istruzione if-else.



3. Confronto tra numeri reali

Come accennato in precedenza, non puoi semplicemente prendere numeri reali e confrontarli. C'è sempre la possibilità che alcune cifre significative vengano scartate, causando effetti collaterali imprevisti.

Ecco perché esiste un approccio testato nel tempo. Se due numeri reali differiscono di un valore molto piccolo, allora possono essere considerati uguali. Esempio:

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

Ma non è tutto ciò di cui dobbiamo preoccuparci, poiché la differenza tra i numeri potrebbe rivelarsi negativa. Quindi, affinché questo approccio funzioni, è necessario confrontare non solo la differenza tra i numeri, ma anche il valore assoluto della differenza tra i numeri:|a-b|

Java ha un metodo per calcolare il valore assoluto di un numero Math.abs():

int m = Math.abs(value);

Di conseguenza, la versione corretta del nostro esempio sopra sarà simile a questa:

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