Corso Java #4: operatori e casting

DiMarco Nisticò

PUBBLICATO IL 18 Apr 2019 ALLE 15:00 - AGGIORNATO IL 19 Agosto 2019 ALLE 10:54

Gli operatori in Java permettono di svolgere svariate funzioni, come l’accesso a determinati oggetti o più semplicemente eseguire operazioni tra variabili.

In Java esistono svariate tipologie di operatori, tra cui logici, aritmetici, Bitwise, confronto e condizionali. Ognuna di queste da la possibilità di svolgere calcoli differenti, come il confronto tra due variabili, la somma di due numeri o l’incremento di una singola variabile. Un primo esempio applicativo degli operatori lo abbiamo visto nella scorsa lezione, quando vi abbiamo mostrato un programma in cui si sommavano due numeri. In quel caso è stato utilizzato l’operatore aritmetico “+” per sommare 4 a 2. Oggi vediamo più nel dettaglio le varie classi di operatori.

Operatori aritmetici

Come ci è stato insegnato anche nell’algebra classica, anche in Java esistono i classici operatori matematici, che permettono di svolgere operazioni tra due o più numeri come addizione, sottrazione o moltiplicazione. Essendo Java un linguaggio fortemente vincolato ai tipi (es. int, float, double e così via), bisogna fare molta attenzione quando si eseguono delle operazioni aritmetiche. Prendiamo ad esempio il seguente programma:

public static void main (String [] args){
int n1=2;
int n2=5;
int divisione=n2/n1;
System.out.println("La somma di "+n2+" e " +n1+" è: "+somma);

}

In questo caso abbiamo definito due variabili di tipo intero e un’operazione di divisione sempre di tipo intero. Se proviamo ad eseguire il codice, noteremo che il risultato è 2 e non 2.5 come dovrebbe essere. Questo perchè il linguaggio Java, come già detto, è dipendente dai tipi di variabile. Dunque avendo dichiarato la divisione come intera, il risultato sarà per forza intero. Per ovviare al problema è possibile seguire due strade. La prima è definire le variabili come float, come nel seguente codice:

public static void main (String [] args){
float n1=2.0;
float n2=5.0;
float divisione=n2/n1;

System.out.println("La somma di "+n2+" e " +n1+" è: "+somma);

}

In questo caso tutte le variabili sono definite a virgola mobile, per cui la divisione aritmetica può restituire anche un valore non intero (nell’esempio 2.5). Però modificare i tipi delle variabili può risultare controproducente se si ha la necessità di mantenere un determinato identificatore, che può essere usato in un altro metodo. Per questo si utilizza la regola del cast, ossia forzare una variabile ad assumere un determinato tipo. Dunque il codice diventerebbe:

public static void main (String [] args){
int n1=2;
int n2=5;
float divisione=(float) n2/ (float) n1;
System.out.println("La somma di "+n2+" e " +n1+" è: "+somma);

}

Il risultato sarà lo stesso, ma abbiamo mantenuto le variabili con il loro tipo dichiarato inizialmente. Per eseguire il casting su un variabile la regola è inserire il tipo da forzare nelle parentesi tonde, seguito poi dalla variabile da forzare. Dunque sarebbe:

float variabile = (tipo da forzare) variabileforzata;

Il casting è utile anche per effettuare un confronto tra numeri di tipo diverso. Ad esempio, se vogliamo confrontare il numero 5 con il numero 6.3, stabilendo quale dei due sia maggiore, non possiamo definire 5 come intero e 6.3 come float e fare il confronto, ma bisognerà effettuare il casting di una delle due variabili e poi confrontarle. Quindi sarebbe:

int n1=(float) 5;
float n2=6.3;

Questa operazione può risultare piuttosto superflua con piccoli programmi poiché si può benissimo definire un numero intero come float o double, aggiungendo la virgola seguita dallo zero e confrontarlo con un altro float. Però con programmi ben più complessi, dove le variabili possono essere utili in classi differenti, il casting risulta un’operazione davvero indispensabile.

Elenco degli operatori aritmetici

Il linguaggio Java, come anche tanti altri linguaggi di programmazione, è dotato dei classici 5 operatori artimetici, ovvero:

  • “+”: esegue una somma
  • “-“: esegue una differenza
  • “*”: esegue una moltiplicazione
  • “/”: esegue una divisione
  • “%”: esegue una divisione tra due numeri e ne ricava il resto

Operatori di incremento e abbreviati

Gli operatori “+” e “-“, oltre ad essere dei classici operatori algebrici, permettono di effettuare l’incremento/decremento di una variabile e di scrivere del codice abbreviato. Vediamo come.

public static void main (String [] args){
int n1=2;
int n2=n1++;
int n3=n2--;
System.out.println(n1+" "+n2+" "+n3);

}

Vediamo la seconda riga, ovvero int n2=n1++;. Dato che l’operatore di incremento si trova dopo la variabile, significa che il compilatore prima assegnerà ad n2 il valore iniziale di n1, ovvero 2, e successivamente incrementa n1 di 1, assegnandolo ad n1. Se invece fosse stato int n2=++n1; allora n1 sarebbe stata prima incrementata e poi assegnata ad n2. Stessa cosa vale per la riga 3. Quindi alla fine il risultato sarebbe 3 1 2, dove n1 è 3 perché viene incrementato alla riga 2, n2 è 1 perché assume prima il valore iniziale di n1 ovvero 2 e poi viene decrementato di 1 alla riga 3, n3 è 2 poiché assume il valore iniziale di n2 ossia 2, che è il valore iniziale di n1.

Provate ad eseguire lo stesso programma posizionando gli operatori di incremento prima delle variabili, verificando il risultato.

Vediamo ora invece gli operatori abbreviati, che permettono di scrivere il codice in maniera più compatta. Sono utili quando vogliamo effettuare un’operazione su una stessa variabile, magari per aggiungere una quantità. Prendiamo in esame le seguenti dichiarazioni:

a = a+3;
b = b-1;
c = c*7;
d = d/3;

Possiamo scriverle in maniera compatta usando la seguente sintassi:

a += 3;
b -= 1;
c *= 7;
d /= 3;

In pratica si antepone l’operatore aritmetico al simbolo “=”. In questo modo si ottiene lo stesso risultato precedente, ma in maniera sintatticamente più elegante e abbreviata.

Operatori logici e di confronto

In questa parte del corso non andremo ad approfondire troppo il concetto di operatori logici e di confronto poiché li tratteremo più nel dettaglio quando parleremo dei cicli di iterazione, visto che vengono utilizzati principalmente nelle condizioni dei cicli. Vi basti sapere però che le regole di base sono le stesse di quanto già visto in C++. Vi diamo comunque un’idea generale di quali sono, così che possiate arrivare preparati alla prossima parte.

Operatori logici

  • && (and): stabilisce due condizioni che devono valere contemporaneamente
  • || (or): stabilisce due condizioni che possono valere entrambe o solo una delle due
  • ! (not): stabilisce una condizione che deve essere diversa da un’altra

Operatori di confronto

  • >: maggiore
  • <: minore
  • =>: maggiore o uguale
  • =<
  • ==
  • !=

Di Marco Nisticò

Sviluppatore informatico, cerco sempre di stare al passo con i tempi in un mondo ormai circondato dalla tecnologia.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.