ePrometeusCorsoJavaJava
testi articoli
Testi Articoli  Download
Home | Basi | Espressioni | Comandi | Classi | Ereditarieta | Eccezioni | Thread | Utilita | 
CorsoJava è ora Video! Free for all!
Clicca Qui!

Espressioni
Espressioni
Primitivi
Costanti
Booleane
Carattere
Numeri
Operatori
Promozione
Overloading
Aritmetici
Virgola Mobile
Relazionali
Binari
Shift
Negazione
And
Or
Condizionale
Incremento
Assegnamento

<<< Relazionali >>>
>>= <<= == !=

I operatori relazionali sono quelli che permettono di confrontare due tipi primitivi. Per caso di uguale e diverso il confronto si applica anche agli oggetti. Negli altri casi invece si tratta di confrontare se un numero è minore, maggiore, minore uguale o maggiore uguale di un altro.

Notare che l'uguaglianza è con due segni '='
mentre l'assegnamento è un segno '=')

Sintatticamente bisogna stare attenti che l'uguaglianza utilizza come operatore il doppio =.

Il singolo = è l'assegnamento. La sintassi di Java abbiamo visto tratta gli assegnamento come espressioni, per cui è necessario distinguere in qualche modo l'assegnamento dal confronto per uguaglianza. Questa distinzione viene fatta utilizzando due diverse operatori. Siccome l'assegnamento è molto più frequente del confronto, si è scelto di assegnare a questo operatore = singolo che è più corto scrivere, mentre = doppio è il confronto. (Notare che per esempio pascal è il contrario: := contro =). Ancora bisogna notare che diverso si scrivere "!=", invece di "<>" come altri linguaggi. Questo perché l'esiste un operatore, il "!", che significa "non" (è la negazione booleana), per cui per uniformità anche l'operatore di diverso si adegua.

Operano su interi e double

Gli operatori di maggiore e minore hanno veramente senso solo sui numeri, quindi su interi e virgola mobile.

Uguale e Diverso operano anche su booleani e oggetti

Invece l'operatore di uguaglianza permette confrontare anche valori booleani, e soprattutto oggetti. Stare attenti a questa cosa: se io scrivo a == b, dove sia a che b sono due oggetti (non due tipi primitivi), voglio dire che l'oggetto a cui si riferiscono è lo stesso. Un errore in cui s'incappa facilmente è quello di confrontare le stringhe con l'uguale, pretendendo un risultato vero se le stringhe contengono gli stessi caratteri. Questo non è in generale vero: posso aver benissimo in oggetti molto simili tra di loro, ma che sono in realtà oggetti distinti. Per confrontare due stringhe per uguaglianza devo utilizzare a.equals(b). In questo caso ottengo vero se le stringhe contengono gli stessi caratteri.

Notare i confronti in floating point di Java

anche i confronti possono riservare qualche sorpresa. In particolare abbiamo visto come il Java abbia una buona cultura matematica, anche i operatori di maggiore e minore dimostrano di aver appreso la lezione. In particolare quando si fanno confronti in virgola mobile, si tiene conto di infiniti e forma indeterminata.

-infinito < finito < + infinito

Qualunque numero finito e più grande di - infinito. Qualunque numero finito è più piccolo di + infinito.

+ infinito == +infinito
NaN != NaN, per cui: isNaN(a) { return ! (a == a); }

posso confrontare due infiniti, ottenendo vero quando sono entrambi + infinito o meno infinito.

Non posso però confrontare la forma indeterminata. Qualunque tentativo di effettuare un confronto con questo valore speciale, ritorna un risultato falso. In questo modo sembrerebbe impossibile riuscire a sapere se si è ottenuta la forma indeterminata, invece è molto semplice: basta confrontare la forma indeterminata con se stessa. L'unico caso in cui un numero è uguale con se stesso è quello in cui è la forma indeterminata. Esiste comunque il metodo Math.isNaN che dice esplicitamente se un numero è una forma indeterminata, ed è il caso di usarlo la maggior parte delle volte perché è più chiaro. Quello che fa comunque è quello che è mostrato nel listato.

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com