Corso di Laurea in Biotecnologie Informatica (Programmazione) Espressioni aritmetiche e cast dei dati numerici Anno Accademico 2009/2010 1 Espressioni aritmetiche Un’espressione aritmetica è una combinazione di operandi che sono numeri (interi o decimali), di operatori aritmetici e di parentesi tonde. La tabella nella slide successiva riporta gli operatori aritmetici per: 1. somma (operatore binario) 2. sottrazione (operatore binario) 3. moltiplicazione (operatore binario) 4. divisione (operatore binario) 5. modulo (operatore binario) 6. negazione aritmetica (operatore unario) 2 Operatori aritmetici Operazione Simbolo Java 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 op1%op2 Calcola il resto della divisione intera tra op1 e op2, dove op1 e op2 sono operandi interi -op1 Trasforma il valore di op1 nel corrispondente di segno opposto Modulo Negazione aritmetica % - NB: op1 e op2 sono due generici operandi numerici (interi o decimali) 3 Operatori aritmetici Ad esempio il seguente codice: int x, y, z; x=3; y=10; z=y%x; System.out.println(z); z=-x; System.out.println(z); stampa: 1 -3 4 Precedenze tra operatori aritmetici Più operatori aritmetici possono essere combinati in espressioni aritmetiche complesse. Essi hanno una precedenza che determina l’ordine in cui vengono valutati (cioè eseguiti). Gli operatori con la stessa precedenza vengono valutati procedendo da sinistra a destra dell’espressione. L’ordine di precedenza può essere modificato utilizzando le parentesi tonde. 5 Precedenze tra operatori aritmetici Elenco degli operatori aritmetici (appena visti) in ordine di precedenza decrescente: 1. negazione aritmetica 2. moltiplicazione *, divisione /, modulo % 3. somma +, sottrazione – 6 Precedenze tra operatori aritmetici Gli operatori aritmetici di moltiplicazione, divisione e modulo hanno quindi la precedenza sugli operatori aritmetici di somma e sottrazione; l’operatore di negazione aritmetica ha la precedenza su tutti. Nei due esempi seguenti: 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/f prima viene valutata b*c, poi d%e, e il risultato di d%e viene diviso per f. In seguito 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/f. 7 Il cast dei dati Si è in precedenza detto che il valore da assegnare ad una variabile deve essere dello stesso tipo primitivo usato nella sua dichiarazione. Cosa succede invece se si tenta di assegnare ad una variabile, di un determinato tipo primitivo, un valore di tipo diverso? Avviene una conversione di tipo, cioè avviene il cosiddetto cast. Considerando i soli tipi primitivi numerici (byte, short, int, long, float, double) si può avere un cast: implicito se avviene automaticamente senza “forzatura” da parte del programmatore, in quanto la conversione non comporta perdita di informazione esplicito se avviene ad opera del programmatore che forza la conversione anche a costo di una perdita di informazione 8 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 9 Il cast dei dati Il cast esplicito è richiesto quando si vuole assegnare a una variabile di tipo “più basso” un valore di tipo “più alto”. Basta specificare tra parentesi tonde, davanti al valore, il tipo primitivo della variabile a cui assegnare tale valore. 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 10