  |
>>= <<= == != |
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.
|