Assegnazioni, operatori ed espressioni Nelle tabelle seguenti sono riassunti i principali operatori di Java.
Operatori aritmetici simbolo nome + addizione sottrazione negazione * moltiplicazione / divisione % modulo o resto
applicato applicato applicato applicato applicato applicato intera
a a a a a a
funzione due operandi restituisce la loro somma due operandi restituisce la loro differenza un solo operando ne cambia il segno due operandi restituisce il loro prodotto due operandi restituisce il loro quoziente due operandi restituisce il resto della divisione
Operatori aritmetici abbreviati simbolo += -= *= /= ++
--
nome addizione sottrazione moltiplicazione divisione incremento
decremento
funzione x += y equivale a x = x+y x -= y equivale a x = x-y x *= y equivale a x = x*y x /= y equivale a x = x/y x++ equivale a x = x+1 la variabile viene incrementata dopo il suo utilizzo ++x equivale a x = x+1 la variabile viene incrementata prima del suo utilizzo x-- equivale a x = x-1 la variabile viene decrementata dopo il suo utilizzo --x equivale a x = x-1 la variabile viene decrementata prima del suo utilizzo
Operatori relazionali simbolo < <= > >= == !=
significato minore di minore o uguale a maggiore di maggiore o uguale a uguale a diverso da
Operatori booleani simbolo nome funzione && AND Applicato a due operandi restituisce true solo se i due operandi hanno entrambi valore true; in ogni altro caso restituisce false. || OR Applicato a due operandi restituisce false solo se i due operandi hanno entrambi valore false; in ogni altro caso restituisce true. ! NOT Applicato ad un operando restituisce false solo l’operando ha valore true; true se l’operando ha valore false.
Autore: Cinzia Bocchi Ultimo aggiornamento: 05/08/11
1
Espressioni e assegnazioni Utilizzando gli operatori visti, possiamo comporre espressioni da assegnare alle variabili. L’assegnazione deve essere realizzata con cautela, verificando che il tipo del valore restituito dal calcolo dell’espressione sia compatibile con il tipo della variabile. Chiarisco che cosa significa compatibile, utilizzando un esempio. Consideriamo l’assegnazione ics = a; Supponiamo che ics sia una variabile di tipo char. Si possono verificare due situazioni: - a è di tipo char; in questo caso i due tipi sono compatibili, anzi coincidono. - a non è di tipo char; l’assegnazione non è consentita. Supponiamo ora che ics sia di tipo int. In questo caso: - se a è di tipo int, i due tipi coincidono e l’assegnazione è realizzabile. - se a è di tipo double, i due tipi sono compatibili ma l’assegnazione deve essere forzata dal programmatore (vedere espressioni aritmetiche). - se a è di qualunque tipo non numerico, l’assegnazione non è consentita perché i tipi sono incompatibili.
Espressioni aritmetiche: promozione e casting Un’espressione aritmetica restituisce sempre un valore numerico, dello stesso tipo degli operandi. Ma se gli operandi sono di tipo diverso? In tal caso viene eseguita una promozione automatica: Durante la valutazione di una espressione aritmetica, il risultato viene convertito nel tipo “più grande” tra i tipi degli operandi. Il termine “più grande” è riferito al range di valori rappresentabili per un certo tipo. In quest’ottica, possiamo stabilire il seguente ordinamento tra tipi numerici: byte < short
short sh1 = 10; short sh2; sh2 = sh1+100; Il risultato della valutazione dell’espressione è 110, ma il tipo è int poiché la costante 100 viene considerata di tipo int. L’assegnazione non può essere eseguita, a meno che il programmatore non lo chieda esplicitamente (vedremo dopo come). Immaginate di voler far entrare un foglio formato A3 (sh1+100) in una cartellina formato A4 (sh2): è impossibile. Per farlo, dobbiamo tagliare o piegare il foglio per ridurlo al formato A4, chiedendo però prima l’autorizzazione: il taglio del foglio potrebbe far perdere informazioni importanti. Con i numeri accade la stessa cosa: adattare un int per farlo entrare in uno short può causare la perdita di informazioni.
Autore: Cinzia Bocchi Ultimo aggiornamento: 05/08/11
2
Esempio Consideriamo il seguente frammento di codice:
double x = 100; La costante 100, di tipo int, viene promossa a double (100.0) e l’assegnazione può essere eseguita senza problemi. Ciò è possibile poiché un int è contenuto comodamente in un double e quindi non vi è perdita di informazioni. Attenzione! La promozione di un tipo a un tipo “più grande” avviene dopo che il calcolo è stato eseguito; ciò può portare a risultati non desiderati. Esempio Consideriamo il seguente frammento di codice:
int num = 10; int den = 4; double ris; ris = num/den ; L’espressione num/den è pari a 10/4. Si tratta di una divisione intera, perchè gli operandi sono int; pertanto restituisce 2. L’assegnazione ris = num/den trasforma 2 in un double, ossia in 2.0. Se vogliamo ottenere il quoziente esatto, 2.5, occorre trasformare, cioè convertire, in double i due operandi num e den prima che l’espressione sia valutata. L’operazione di conversione, in Java, prende il nome di cast e si realizza anteponendo all’espressione, tra parentesi tonde, il tipo in cui si vuole convertire gli operandi. Il codice per ottenere il quoziente esatto della divisione è:
int num = 10; int den = 4; double ris; ris = (double)num/den ; Attenzione! Nel casting l’espressione è valutata solo dopo che tutti gli operandi sono stati convertiti nel tipo desiderato. Il casting può essere eseguito solo tra tipi che sono compatibili.
Espressioni logiche e di confronto Con gli operatori relazionali e booleani è possibile comporre espressioni logiche, che restituiscono quindi solo true o false. Questo significa che, in un’assegnazione, la variabile di destinazione deve essere di tipo boolean. Gli operatori relazionali, o di confronto, possono essere applicati a tutti i tipi per i quali è previsto un ordinamento interno. Gli operatori booleani possono essere utilizzati, invece, solo con operandi di tipo booleano.
Autore: Cinzia Bocchi Ultimo aggiornamento: 05/08/11
3
Esempio Consideriamo il seguente frammento di codice:
int x = int y = boolean b = x
10; 40; b; ;
Dopo la valutazione dell’espressione x
boolean p = true; boolean q = false; boolean b1,b2; b1 = p && q; b2 = p || q; Dopo la valutazione delle espressioni, b1 vale false, mentre b2 vale true. Esempio Con gli operatori è possibile scrivere espressioni complesse:
boolean p = true; boolean b; int a = 3; b = p && (a<(10*3)); L’espressione p && (a<(10*3)) viene valutata in questo modo : 1. si calcola 10*3, che è pari a 30 di tipo int; 2. si calcola (a<30) che restituisce true; 3. si calcola p && true, che restituisce true. Pertanto, b vale true.
_______________________________________________________________________ Quest'opera è stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
Autore: Cinzia Bocchi Ultimo aggiornamento: 05/08/11
4