Corso di Informatica
(Programmazione)
Lezione 8 (7 novembre 2008)
Programmazione in Java:
operatori aritmetici,
operatori di assegnamento e cast
1
Espressione
Un’espressione in generale è una “combinazione”
di operatori, di operandi (valori o variabili) e di
parentesi tonde, e produce (restituisce) un
valore di un certo tipo
Ad esempio:
- ((a+b+c)/(p-y))*k
- ((a+3)*b)-4*c+
- 2.1*a+1.34/b
dove a, b, c, p, y e k sono variabili di tipo
numerico; +, -, /, * sono gli operatori di somma,
sottrazione, divisione e moltiplicazione
2
Ancora sull’operatore ‘=‘…
Si è in precedenza visto che l’operatore di
assegnamento ‘=‘ permette di assegnare il
valore ad una variabile:
<identificatore>=<valore>;
Dal momento che un’espressione restituisce un
valore, si può anche scrivere:
<identificatore>=<expr>;
Dove <expr> è un’espressione che restituisce un
valore dello stesso tipo della variable identificata
da <identificatore>. <expr> può anche essere data
da un’unica variabile.
3
Ancora sull’operatore ‘=‘…
… in conclusione ad una variabile, tramite
l’operatore ‘=‘, si può assegnare:
 un valore esplicito
<identificatore>=<valore>;
 il valore di un’espressione
<identificatore>=<expr>;
 il contenuto di un’altra variabile
<identificatore>=<variabile>;
4
Ancora sull’operatore ‘=‘…
… siccome l’operatore ‘=‘ ha in genere
precedenza più bassa rispetto a qualsiasi altro
operatore significa che nell’istruzione:
<identificatore>=<expr>;
prima viene valutato il valore di <expr> e poi
questo valore viene assegnato alla variabile
indicata a sinistra di ‘=‘. Il seguente codice:
int x=1;
x=x+1;
System.out.println(“x=“+x);
stampa la stringa “x=2” e va a capo
5
Ancora sull’operatore ‘=‘…
Esempio:
public class AreaTriangolo {
public static void main(String arg[]) {
int base;
int altezza;
int areaTriangolo;
base=200;
altezza=base;
//Assegno un valore esplicito
//Assegno una variabile
/*Assegno l’espressione (in questo caso
aritmetica)che fornisce l’area del triangolo*/
areaTriangolo=(base*altezza)/2;
System.out.println(“Area=“+areaTriangolo);
}
}
6
Gli operatori
Un operatore è un simbolo che regola
l’esecuzione di un’espressione e che restituisce
un valore che dipende dal tipo di operandi su cui
agisce e dal tipo di operatore stesso.
Un operatore può essere:
 unario  richiede un solo operando
 binario  richiede due operandi
 ternario  richiede tre operandi
7
Gli operatori (notazioni)
Indicato con OP un operatore qualsiasi e con
op1 e op2 due operandi qualsiasi, si ha che:
 gli
operatori unari utilizzano la:
 notazione prefissa se l’operatore appare
prima dell’operando, ad esempio  OP op1
 notazione postfissa se l’operatore appare
dopo l’operando, ad esempio  op1 OP
 gli operatori binari utilizzano la notazione
infissa in cui l’operatore appare tra i due
operandi, ad esempio  op1 OP op2
8
Precedenze tra operatori
Gli operatori possono essere combinati
in espressioni complesse e hanno una
precedenza che determina l’ordine in
cui vengono valutati (eseguiti). Gli
operatori con la stessa precedenza
vengono valutati da sinistra a destra.
L’ordine di precedenza può essere
modificato utilizzando le parentesi
tonde.
9
Precedenze tra operatori
Esempi di espressioni aritmetiche in cui
moltiplicazione e divisione hanno la precedenza
su somma e sottrazione:
a+b+c+d  prima viene valutata a+b, poi si
aggiunge ad a+b il valore di c e poi si aggiunge ad
a+b+c il valore di d
a+b*c+d/e  prima viene valutata b*c, poi
d/e, poi viene sommato il contenuto di a al
risultato di b*c. Infine al risultato di a+b*c viene
aggiunto il risultato di d/e. L’ordine di valutazione
(e il risultato) cambierebbe se si scrivesse 
(a+b)*(c+d)/e
10
Tipi di operatori
Gli operatori si possono suddividere in:
 aritmetici
 aritmetici di incremento/decremento
 di assegnamento (qualcosa è stato già visto…)
 relazionali (…nella prossima lezione)
 logici (…nella prossima lezione)
 bit a bit (che non vedremo…)
11
Operatori aritmetici
Operatore
Descrizione
Uso
Significato
+
Somma
op1+op2
Somma il valore di op1 a
quello di op2
-
Sottrazione
op1-op2
Sottrae il valore di op2 a
quello di op1
*
Moltiplicazione
op1*op2
Moltiplica il valore di op1
con quello di op2
/
Divisione
op1/op2
Divide il valore di op1 con
quello di op2
%
Modulo
op1%op2
Calcola il resto della
divisione tra op1 e op2
-
Negazione
aritmetica
-op1
Trasforma il valore di op1
nel corrispondente di segno
opposto
Validi per operandi di tipo intero e in virgola mobile
12
Operatori aritmetici
Ad esempio il seguente codice:
int x, y, z;
x=3;
y=10;
z=y%x;
//Modulo
System.out.println(“Resto=“+z);
z=-x;
//Negazione aritmetica
System.out.println(“Opposto=“+z);
stampa a video:
Resto=1
Opposto=-3
e va a capo.
13
Operatori aritmetici di
incremento/decremento
Operatore
Descrizione
++
Incremento di
1 in notazione
prefissa
++
Incremento di
1 in notazione
postfissa
--
Decremento di
1 in notazione
prefissa
--
Decremento di
1 in notazione
postfissa
Validi per operandi di tipo intero
Uso
Significato
++op1
Incrementa op1 di 1 e
valuta il valore
dell’espressione dopo aver
incrementato
op1++
Incrementa op1 di 1 e
valuta il valore
dell’espressione prima aver
incrementato
--op1
Decrementa op1 di 1 e
valuta il valore
dell’espressione dopo aver
incrementato
op1--
Decrementa op1 di 1 e
valuta il valore
dell’espressione prima aver
incrementato
14
Operatori aritmetici di
incremento/decremento
Ad esempio il seguente codice:
int x, y;
x=3;
y=++x
//Incremento prefisso
System.out.println(“x=“+x+” y=“+y);
x=3;
y=x++;
//Incremento postfisso
System.out.println(“x=“+x+” y=“+y);
stampa a video:
x=4 y=4
x=4 y=3
e va a capo.
L’effetto delle espressioni ++x e di x++ è identico
dal punto di vista del contenuto della variabile
x che quindi diventa 4 in entrambi i casi. La
differenza tra le due notazioni sta nel diverso
valore restituito dalle due espressioni ++x e x++.
Nel primo caso è 4 e nel secondo è 3.
15
Operatori aritmetici di
incremento/decremento
… analogo discorso per il decremento:
int x, y;
x=3;
y=--x //Decremento prefisso
System.out.println(“x=“+x+” y=“+y);
x=3;
y=x--;
//Decremento postfisso
System.out.println(“x=“+x+” y=“+y);
stampa a video:
x=2 y=2
x=2 y=3
e va a capo.
L’effetto delle espressioni --x e di x-- è identico
dal punto di vista del contenuto della variabile
x che quindi diventa 2 in entrambi i casi. La
differenza tra le due notazioni sta nel diverso
valore restituito dalle due espressioni --x e x--.
Nel primo caso è 2 e nel secondo è 3.
16
Operatori aritmetici di
incremento/decremento
Espressioni di shortcut per incremento
Forma estesa
Shortcut
Risultato
dell’esecuzione
int x=0;
int y;
y=x;
x=x+1;
int x=0;
int y;
y=x++;
x=1
y=0
int x=1;
int y;
x=x+1;
y=x;
int x=0;
int y;
y=++x;
x=1
y=1
Attenzione! Nell’incremento in notazione postfissa l’operatore
di assegnamento ‘=‘ ha quindi la precedenza su ++
17
Operatori aritmetici di
incremento/decremento
Espressioni di shortcut per decremento
Forma estesa
Shortcut
Risultato
dell’esecuzione
int x=1;
int y;
y=x;
x=x-1;
int x=1;
int y;
y=x--;
x=0
y=1
int x=1;
int y;
x=x-1;
y=x;
int x=1;
int y;
y=--x;
x=0
y=0
Attenzione! Nel decremento in notazione postfissa l’operatore
di assegnamento ‘=‘ ha quindi la precedenza su --
18
Precedenza degli operatori
aritmetici
Precedenze degli operatori aritmetici:
 massima precedenza  pre-incremento ++,
pre-decremento --, negazione aritmetica -
 media precedenza  post-incremento ++ e
post-decremento - bassa precedenza  moltiplicazione *,
divisione / e modulo %
minima precedenza  somma + e sottrazione –
19
Operatori di assegnamento
Operatore
Istruzione
Significato
=
<var_id>=<expr>;
…già visto!
+=
<var_id>+=<expr>;
<var_id>=<var_id>+<expr>
-=
<var_id>-=<expr>;
<var_id>=<var_id>-<expr>
*=
<var_id>*=<expr>;
<var_id>=<var_id>*<expr>
/=
<var_id>/=<expr>;
<var_id>=<var_id>/<expr>
%=
<var_id>%=<expr>;
<var_id>=<var_id>%<expr>
20
Il cast dei dati
Si è detto che il valore da assegnare ad una variabile deve
essere del suo stesso tipo. Cosa succede dunque se si tenta
di assegnare ad una variabile di un tipo un valore di tipo
diverso?
Il cast rappresenta l’operazione di conversione di tipo ed è
consentito tra tipi primitivi (ad esempio tra int e float).
Il cast può essere:
 implicito  avviene automaticamente in quanto è
un’operazione sicura che non comporta perdita di
informazione
 esplicito  avviene ad opera del programmatore che
forza la conversione anche a costo di una perdita di
informazione
21
Il cast dei dati
Il cast implicito avviene automaticamente quando
ad una variabile di tipo “più alto” viene assegnato
un valore di tipo “più basso”. Ad esempio:
float f;
int x=10;
f=x;
Il valore di x (10) viene automaticamente
convertito in floating point  10.0 e quindi
assegnato alla variabile f
I tipi primitivi numerici possono essere ordinati dal
“più basso” al “più alto” nel modo seguente:
byte  short  int  long  float  double
22
Il cast dei dati
Il cast esplicito deve essere esplicitato
(anteponendo, al valore da assegnare, il tipo
scritto tra parentesi tonde) quando ad una
variabile di tipo “più basso” viene assegnato un
valore di tipo “più alto”. Ad esempio:
int x;
double d=3.6;
x=(int)d;
Il valore di d (3.6) viene “a forza” convertito in
intero  3 e quindi assegnato alla variabile x
I tipi primitivi numerici possono essere ordinati dal
“più basso” al “più alto” nel modo seguente:
byte  short  int  long  float  double
23
Scarica

ProgrammazioneLEZ8