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