http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 1
Corso di Laurea Ingegneria InformaticaFondamenti di Informatica
Dispensa 09
Tipi ed espressioni
Carla LimongelliOttobre 2011
Tipi ed espressioni 2
Prerequisiti
nozioni algebriche relative a N, Z, Q, R
rappresentazione dei numeri in base b
aritmetica modulare in complemento a 2
aritmetica floating-point
algebra di Boole, operatori booleani e
loro proprietà
http://www.dia.uniroma3.it/~java/fondinf/
Tipi ed espressioni 3
Contenuti
Tipi di dato
Tipi primitivi per numeri interi: il tipo int
Tipi primitivi per numeri reali: il tipo double
Espressioni
Il tipo primitivo char
Algebra di Boole e tipo primitivo boolean
Altri tipi primitivi
Conversione tra tipi • conversione implicita • conversione esplicita
http://www.dia.uniroma3.it/~java/fondinf/
4
Obiettivi (competenze da acquisire)
Al termine dell’unita’ didattica lo studente sarà in grado di Saper applicare correttamente operatori coerenti con diversi
tipi di dato Sapere che un tipo di dato e’ sempre caratterizzato da
Un insieme di valori che definiscono il dominio Un insieme di operazioni sugli elementi del dominio
Saper gestire le espressioni formate da diversi tipi di dato avendo in mente La precedenza tra gli operatori Il modo in cui vengono valutate le espressioni Sapendo gestire gli operatori sovraccarichi
Saper effettuare conversioni esplicite e sapere quando si verificano le conversioni implicite
La rappresentazione dell’informazionehttp://www.dia.uniroma3.it/~java/fondinf/
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 5
Introduzione . . .
In algebra, un tipo di dato (o tipo) è costituito da un insieme di valori (detto dominio del tipo) un insieme di operazioni sul dominio del tipo
{ +, -, *, div, mod } { +, -, *, / }
…,-3,-2,-1,0,1,2,3,……,-2,…,0, 0.25,…,0.85,…,1,…,1.4142,…,2,…
La nozione di tipo di dato nei linguaggi di programmazione è simile a quella delle strutture algebriche dell’algebra
Z R
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 6
. . . introduzione
Nei linguaggi di programmazione un tipo di dato è costiuito da due componenti
Una componente statica Tutti gli elementi che costituiscono il dominio
opportunamente rappresentati
Una componente dinamica Operazioni del dominio Tutti e soli gli operatori ammissibili
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 7
Tipi, classi e oggetti
Una classe è caratterizzata da: Un insieme di elementi
della classe (oggetti) Un insieme di
operazioni (metodi) che possono essere eseguite sugli elementi
• Nomi di metodi
Un tipo è caratterizzato da: Un insieme di valori
che definiscono il dominio
Un insieme di operazioni su elementi del dominio
• Operatori infissi
Per comodità di programmazione, in Java, alcuni tipi di base non sono definiti come oggetti,
ma come tipi detti primitivi
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 8
R(3) = 0011, R(4) = 0100, R(7) = 0111
3 = I (0011) , 4 = I (0100) , 7 = I (0111)
3, 4 7+
R I I R
+
0011, 0100 0111
Rappresentazione e interpretazione
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 9
Tipizzazione
Gli elementi sintattici di un linguaggio di programmazione sono caratterizzati da un tipo letterali (valori costanti) – come 10 e 1.41421 variabili – al momento della dichiarazione parametri e valori restituiti dai metodi espressioni – con letterali, variabili, operatori,
invocazione di metodi e creazione di oggettiI tipi sono anche importanti per
stabilire la modalità di memorizzazione dei valori delle variabili
stabilire il significato degli operatori rilevare eventuali errori nell’uso di variabili, operatori
e invocazioni di metodi
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 10
Tipi primitivi e tipi riferimento
In Java ci sono due categorie di tipi
tipi primitivi• predefiniti nel linguaggio • int, byte, short, long, char, float, double, boolean
tipi riferimento • ogni classe definisce un tipo riferimento • String
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 11
Il tipo int Rappresentazione
In complemento a 2, con 32 bit Dominio
Interi relativi compresi tra -231 e + 231-1 Operatori
+, -, *, / (quoziente), % (resto)
è possibile scrivere dei valori costanti che rappresentano numeri interi come 0, 1, 4126, –4543.
un letterale è la denotazione di un valore costante è possibile dichiarare variabili di tipo int:
int numero; è possibile assegnare a una variabiledi tipo int il valore di una espressione
di tipo int:numero = (4126 + 1) * 3;
è possibile scrivere delle espressioni di tipo int usando gli operatori aritmetici +, –, *, / e % e le parentesi ( e ),
ad esempio, (4126 + 1) * 3
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 12
Il tipo int: Rappresentazione e Dominio
Il tipo int di Java ha una rappresentazione a 32 bit in complemento a 2: Rappresentazione
modulareIl tipo int di Java ha come domino un sottoinsieme degli interi relativi:
[-2147483648, …, +2147483647]
Una variabile di tipo int può assumere
un valore tra -231 e +231-1
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 13
Aritmetica modulare
int numero; numero = 2147483647 + 1; // quanto vale ora numero?
Nei calcolatori per rappresentare in binario i numeri interi relativi, viene adottata una aritmetica di tipo “modulare” intuitivamente, viene adottata una rappresentazione
“circolare” per i numeri, ovvero il numero che logicamente segue il massimo numero intero positivo è il minimo numero negativo
2147483647 + 1 vale -2147483648
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 14
Rappresentazione modulare degli interi
Esempio: con un numero di bit N = 3, [-4, …,+3]
000
111
110
101
100
011
010
001
0
1
-4
-3
-2
-1
3
2
+ 1
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 15
Il tipo int: gli operatori aritmetici
Gli operatori aritmetici rappresentano operazioni aritmetiche
• se applicati a operandi interi restituiscono un valore intero • l’operatore + rappresenta l’operazione somma: 11 + 5 vale 16• l’operatore - rappresenta l’operazione differenza: 11 - 5 vale 6• l’operatore * rappresenta l’operazione prodotto: 11 * 5 vale 55• l’operatore / rappresenta la divisione intera – quoziente
– 10 / 2 vale 5– 11 / 2 vale 5 — e non vale 5.5 – -11 / 2 vale - 5
• l’operatore % rappresenta il resto della divisione intera 10 % 2 vale 0
13 % 5 vale 3
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 16
Operatori aritmetici, espressioni e parentesi
Gli operatori aritmetici sono binari • due operandi
– in generale sono delle espressioni
• forma infissa
Nella formazione delle espressioni è possibile usare anche le parentesi tonde ( e )
• ad esempio 3 è una espressione che vale 3
( 2 * 3 ) + 4 vale 10
12 / 3 + 4 vale 8
2 (3 + 4) non è una espressione — perché?
quanto vale (1 / 2) + (1 / 2) ?
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 17
Divisione per zero
Nell’aritmetica intera non è consentita la divisione per zero Ci sono pre-condizioni anche per gli operatori, ad esempio
int a, b, c; a = 2; b = 0; c = a/b; // NO, divisione per zero!
La compilazione non segnala alcun errore, MA durante l’esecuzione si verifica un errore di semantica dinamica – errore al tempo di esecuzione
• il programma termina con la segnalazione di un errore di tipo ArithmeticException
• in Java, gli errori al tempo di esecuzione si manifestano sotto forma di eccezioni
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 18
Altri tipi primitivi numerici interi
Java fornisce altri tipi primitivi per la rappresentazione di numeri interi relativi – con un intervallo di definizione diverso
• il tipo long – 64 bit, tra -9223372036854775808 e +9223372036854775807 ossia [-263,…,+263-1]
– i letterali long terminano con il carattere L – ad esempio, 1000L – il carattere L terminale permette di distinguere i letterali di tipo long dai letterali di
tipo int
• il tipo short – 16 bit, tra -32768 e +32767, ossia [-215,…,+215-1]• il tipo byte – 8 bit, tra -128 e +127, ossia [-27,…,+27-1]
– non esistono letterali short né byte (di fatto inutili !!)
Gli operatori definiti su questi tipi interi relativi sono gli stessi definiti per il tipo int ovviamente con effetti diversi
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 19
Il tipo char
Rappresentazione 16 bit
Dominio Tutti i caratteri dell’alfabeto unicode 2.0 (www.unicode.org)
Operatori +, ++, -, --, … il tipo char è un tipo numerico Ad ogni carattere corrisponde un numero d’ordine
i letterali char sono normalmente scritti tra apici semplici; 'a', 'B', '5'
alcune eccezioni: le sequenze di escape'\'' indica il carattere ''\"' indica il carattere "'\\' indica il carattere \
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 20
Codifica e aritmetica dei caratteri
Alcune informazioni utili sulla codifica dei caratteri • i codici dei caratteri alfabetici minuscoli sono tra loro consecutivi – dalla
a alla z • i codici dei caratteri alfabetici maiuscoli sono tra loro consecutivi – dalla
A alla Z • i codici dei caratteri per le cifre sono tra loro consecutivi – dallo 0 al 9 • i codici delle cifre sono tutti minori di quelli dei caratteri alfabetici
maiuscoli • i codici dei caratteri alfabetici maiuscoli sono tutti minori di quelli dei
caratteri alfabetici minuscoli
Aritmetica dei caratteri • se car vale 'a', allora car++ cambia il valore di car in ‘b' • se car vale 'f', allora (char) (car – 'a' + 'A') vale 'F'
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 21
Il tipo double: rappresentazione e dominio
Rappresentazione un numero reale in virgola mobile secondo lo
standard IEEE 754-1985 a 64 bit (mantissa con 18 cifre significative ed esponente tra -324 e +308)
Dominio Insieme di 264 razionali positivi e negativi
• Valore minimo assoluto: 1.79769313486231570 . 10-308
• Valore massimo assoluto: 2.250738585072014 . 10+308
• Precisione ~15 cifre decimali
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 22
Letterali in virgola mobile
I letterali di tipo double • contengono un punto, e/o• contengono una E che separa la mantissa dall’esponente, e/o • terminano per D
– 3.2E–6 denota il valore 3.2 × 10–6
– ma anche 32E–7 o 0.0000032
Attenzione • il letterale 3 denota un valore intero• i letterali 3. 3.0 3E0 3D denotano valori reali
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 23
Il tipo double: operatori
Gli stessi operatori degli int: + - * / % • ma operazioni diverse
Gli operatori aritmetici applicati ad operandi reali • indicano un’operazione tra reali • il risultato è un numero reale • ad esempio, 7.0/2.0 restituisce 3.5
– in questo caso, l’operatore / è interpretato come l’operatore di divisione tra numeri reali
• calcolano un risultato approssimato (invece l’aritmetica intera è una aritmetica esatta, anche se modulare)
– I risultati sono soggetti ad arrotondamenti, e quindi a perdita di precisione– ad esempio, 1E100+1E-100 vale 1E100
Gli operatori aritmetici sono sovraccarichi
Lo stesso simbolo indica operazioni diverse
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 24
La classe Math
La classe Math del package java.lang contiene la definizione di molti metodi di utilità per la matematica
• ad esempio double Math.sqrt(double x): calcola la radice quadrata di x
double Math.pow(double x, double y):calcola x elevato alla y
double Math.log(double x): calcola il logaritmo naturale di x
double Math.sin(double x): x e’ espresso in radianti
double Math.random(): restituisce un numero casuale nell’intervallo semi-aperto [0.0, 1.0)
La classe Math contiene anche la definizione di due costanti con la migliore approssimazione possibile (per un valore di tipo double)
Math.E: 2.7182818284590452354
Math.PI: 3.14159265358979323846
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 25
Espressioni
Molti elementi sintattici di Java sono classificati come espressioni
• ad esempio, il lato destro di una assegnazione, gli argomenti nell’invocazione di un metodo
Le espressioni vengono formate mediante la composizione di operandi e operatori
• gli operatori sono simboli usati per denotare operazioni (come ad esempio gli operatori aritmetici) da valutare sui rispettivi argomenti, chiamati operandi
• attenzione: un operatore può rappresentare più operazioni
A ciascuna espressione è associato un tipo • determinato sulla base degli operandi e degli operatori che vi
occorrono
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 26
Espressioni semplici
Sono formate da un singolo operando un letterale è una espressione
• denota un valore costante, il tipo viene stabilito sulla base della sua forma lessicale
una variabile è una espressione • denota il valore della variabile, il tipo viene stabilito sulla base della sua
dichiarazione una costante è una espressione
• denota il valore della costante, il tipo viene stabilito sulla base della sua dichiarazione
la creazione di un oggetto è una espressione • denota il riferimento all’oggetto creato, il tipo è la classe da cui l’oggetto
viene creato l’invocazione di un metodo è una espressione
• denota il valore restituito dal metodo, il tipo è il tipo di ritorno l’accesso a una variabile di un oggetto è una espressione
• denota il valore della variabile, il tipo è il tipo della variabile
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 27
Espressioni composte …
Sono formate da più operatori e operandi Esempio: se espr1 e espr2 sono espressioni, allora
• anche espr1 + espr2 e espr1 * espr2 sono espressioni
Il tipo di una espressione viene determinato sulla base del tipo dei suoi operandi e delle caratteristiche degli operatori che vi occorrono
• Esempio 1: se espr1 e espr2 sono espressioni di tipo int, allora anche espr1 + espr2 è una espressione di tipo int
• Esempio 2: se espr1 e espr2 sono espressioni di tipo double, allora anche espr1 + espr2 è una espressione di tipo double
L’operatore + è lo stesso nei due esempi ?
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 28
… Espressioni composte
Esempio 2 * 3 + 4 è una espressione, in cui compaiono due operatori
• gli operandi dell’operatore * sono i letterali 2 e 3
• gli operandi dell’operatore + sono l’espressione 2*3 e il letterale 4
nell’espressione 3.14 * r * r ci sono due operatori • gli operandi dell’operatore * più a sinistra sono i letterali 3.14 e la
variabile r
• gli operandi dell’operatore * più a destra sono l’espressione 3.14*r e la variabile r
anche Math.sqrt(a) + Math.sqrt(b) è una espressione • in cui l’operatore somma va applicato ai risultati delle invocazioni di
metodi Math.sqrt(a) e Math.sqrt(b)
anche Math.sqrt(a + b) è una espressione • in cui il metodo Math.sqrt va invocato usando come argomento il
risultato della valutazione dell’espressione a+b
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 29
Valutazione delle espressioni
Le espressioni vengono valutate calcolando il valore di ciascun operando, e applicando gli operatori uno alla volta, in un ordine che dipende:dalla precedenza degli operatori che vi occorrono
• normalmente gli operatori moltiplicativi vanno applicati prima di quelli additivi
a parità di precedenza, dall’associatività degli operatori • normalmente operatori con uguale precedenza vanno valutati da
sinistra verso destra
dalle parentesi • che sono un operatore
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 30
Valutazione delle espressioni
Qual è il risultato delle seguenti espressioni? 6 + 2 + 1 vale 9
2 * 3 + 4 vale 10 — oppure 14?
4 + 2 * 3 vale 10 — oppure 18?
6 - 2 - 1 vale 3 — oppure 5?
In questi semplici esempi, il valore delle espressioni è quello che uno si aspetta
• in generale, il valore di una espressione viene calcolato valutando un operatore alla volta
– se una espressione è composta da più operatori, in che ordine vengono applicati i diversi operatori e quali sono i loro operandi?
• le regole che stabiliscono l’ordine di valutazione delle espressioni sono basate sui concetti di precedenza e associatività tra operatori
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 31
Precedenza degli operatori
La precedenza degli operatori permette di stabilire, nell’ambito di una espressione, qual è l’operatore che deve essere applicato per primo
• ad esempio, una regola di precedenza è la seguente – nelle espressioni aritmetiche, gli operatori moltiplicativi *, / e % hanno precedenza
(ovvero, devono essere valutati prima degli) sugli operatori additivi + e -
• quindi 2 * 3 + 4 vale 10 — e non 14
4 + 2 * 3 vale 10 — e non 18
2 3
4
+
*
primo operatore a essere valutato
secondo operatore a essere valutato
2 3
4
+
*
primo operatore a essere valutato
secondo operatore a essere valutato
2 3
4
+
*
primo operatore a essere valutato
secondo operatore a essere valutato
2 3
4
+
*
primo operatore a essere valutato
secondo operatore a essere valutato
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 33
Associatività degli operatori
L’associatività degli operatori permette di stabilire l’ordine di applicazione tra operatori che hanno la stessa precedenzatutti gli operatori binari sono associativi a sinistra (ad eccezione degli operatori di assegnazione, che sono associativi a destra) quindi
6 + 2 + 1 viene interpretato come (6 + 2) + 1 e vale 9
6 - 2 - 1 viene interpretato come (6 - 2) - 1 e vale 3 (non 5)
2
1
6
–
–
primo operatore a essere valutato
secondo operatore a essere valutato
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 34
Parentesi
Le parentesi sono un operatore che ha precedenza massima tra gli operatori, che permette quindi di imporre l’ordine di valutazione desiderato
• ( 4 + 2 ) * 3 vale 18 • 6 - ( 2 - 1 ) vale 5
• solo parentesi tonde, eventualmente annidate ( 10 * (10+1) ) / 2 vale 55
• le parentesi quadre e graffe hanno un altro significato
Stilisticamente, le parentesi andrebbero utilizzate
solo per modificare la precedenza
e/o l’associatività degli operatori
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 35
Operatore di assegnazione
Anche = è un operatore, l’operatore di assegnazione
a = 5• l’operatore di assegnazione è binario
– il primo operando è il nome di una variabile – il secondo operando è una espressione
• semantica dell’assegnazione • essendo un operatore, la sua valutazione ha anche l’effetto di restituire
un valore – il valore dell’espressione, ovvero il valore assegnato alla variabile
a = b = 5;
System.out.println(a=8);
questo uso è sconsigliato ! ! !
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 36
Operatori di assegnazione composti
Gli operatori di assegnazione composti sono ottenuti componendo un operatore aritmetico binario con l’operatore di assegnazione
a += 5 equivale all’assegnazione a = a + 5
a -= 5 equivale all’assegnazione a = a - 5
a *= 5 equivale all’assegnazione a = a * 5
a /= 5 equivale all’assegnazione a = a / 5
a %= 5 equivale all’assegnazione a = a % 5
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 37
Operatori di incremento e decremento
Due operazioni molto comuni sono l’incremento e il decremento di uno di una variabile intera
a = a+1; // equivalente a: a +=1 b = b-1; // equivalente a: b -=1
Queste operazioni sono molto comuni, e per questo motivo Java fornisce gli operatori di incremento ++ e decremento – – a++; // equivalente a: a +=1 b--; // equivalente a: b -=1
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 38
Interpretazione degli operatori sovraccarichi
Per gli operatori aritmetici • se entrambi gli operandi sono interi
–l’operando indica una operazione tra interi e il risultato è intero
• se entrambi gli operandi sono reali –l’operando indica una operazione tra reali e il risultato è
reale• se un operando è reale e l’altro è intero
–viene convertito il valore intero a un valore reale e viene eseguita l’operazione tra reali
7 / 2 vale 3 7.0 / 2.0 vale 3.5 7 / 2.0 e 7.0 / 2 valgono 3.5
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 39
Esercizio
• Determinare tipo e valore per ciascuna delle seguenti espressioni 1/2 + 1/2
1.0/2 + 1/2.0
1.0/2 + 1/2
• Il significato di un operatore dipende solo dal tipo dei suoi operandi, e non dal contesto in cui il suo risultato viene utilizzato
• ad esempio, l’ultima espressione vale 0.5 (e non 1.0). Infatti
1 2
+
/
entrambi gli operandi sono di tipo int, pertanto viene interpretato come operatore intero
(almeno) un operando è di tipo double, pertanto vengono interpretati come operatori razionali 1.0 2
/
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 40
Divisione per zero
A differenza di quanto avviene nell’aritmetica intera, la divisione per zero è una operazione consentita nell’aritmetica razionale
• il dominio dei tipi numerici reali comprende una rappresentazione dell’infinito
Ad esempio double a, b, c; a = 2; b = 0; c = a/b;
System.out.println(c); // stampa Infinity
I valori infiniti possono essere acceduti come costanti notevoli delle classi Double e Float (del package java.lang)
• Double.POSITIVE_INFINITY e Double.NEGATIVE_INFINITY denotano
rispettivamente + e –• inoltre, Double.NaN (Not a Number) denota un valore che non è un numero
(ad esempio, il risultato di 0.0/0.0)
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 41
Il tipo boolean
Rappresentazione Concettualmente … 1 bit
Dominio Due elementi: true (vero), false (falso)
Operatori And: &, && Or: I, II Not: !
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 42
Algebra di Boole e tipo primitivo boolean
Un tipo di dato molto importante e utile nella programmazione è il tipo delle espressioni usate nella scrittura di condizioni per le istruzioni di controllo
• questo tipo di dato è rappresentato in Java dal tipo primitivo boolean (in onore del matematico britannico George Boole (1815-1864))
• il significato del tipo boolean può essere descritto con riferimento alla sua formulazione matematica, ovvero all’algebra di Boole
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 43
Algebra di Boole
L’algebra di Boole è formata dai seguenti elementi
• un dominio composto da due soli elementi, corrispondenti ai valori di verità “vero” e “falso”, che denoteremo rispettivamente mediante i simboli TRUE e FALSE
tre operatori (chiamati operatori booleani)• l’operatore unario ¬ (“not”) di complementazione o negazione • l’operatore binario (“and”) di congiunzione • l’operatore binario (“or”) di disgiunzione
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 47
Operatori logici
A valori di tipo boolean è possibile applicare i seguenti operatori logici
• l’operatore ! di negazione ! true vale false
! false vale true
• l’operatore && di congiunzione condizionale a && b vale true se sia a che b valgono true – l’operando b viene valutato solo se a vale true – false && ... e true && false valgono false – true && true vale true
• l’operatore | | di disgiunzione condizionale a | | b vale true se almeno uno tra a e b vale true – l’operando b viene valutato solo se a vale false– true | | ... e false | | true valgono true – false | | false vale false
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 48
Operatori logici (non condizionali)
Java fornisce altri due operatori logici non condizionali, varianti degli operatori && e | |
• l’operatore & di congiunzione (non condizionale)
a & b vale true se sia a che b valgono true –entrambi gli operandi a e b vengono valutati
• l’operatore | di disgiunzione (non condizionale)
a | b vale true se almeno uno tra a e b vale true –entrambi gli operandi a e b vengono valutati
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 49
Espressioni di tipo boolean
Nella valutazione di espressioni di tipo boolean (che coinvolgono operatori logici)
• l’operatore di negazione ! ha la precedenza maggiore tra tutti gli operatori logici (condizionali e non)
• l’operatore di congiunzione && ha precedenza maggiore dell’operatore di disgiunzione | |
• gli operatori logici non condizionali | e & hanno precedenza maggiore di quelli condizionali | | e &&
Esercizio • valutare le seguenti espressioni
! true && false
! (true && false)
(true && false) | | ! (true && false)
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 50
Operatori relazionali
• L’avere a disposizione il tipo boolean permette di confrontare una coppia di valori per verificare se tra questi valori sussiste o meno una certa relazione
– mediante gli operatori relazionali» si applicano a coppie di operandi
» restituiscono un valore boolean
– l’operatore maggiore di, > – l’operatore maggiore o uguale di, >= – l’operatore minore di, < – l’operatore minore o uguale di, <= – l’operatore uguale a, ==
» da non confondere con l’operatore di assegnazione =
– l’operatore non uguale a, !=
• Gli operatori relazionali hanno precedenza minore dell’operatore di negazione, ma maggiore degli operatori logici
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 51
Operatori relazionali
Ad esempio 10 > 5 vale true
10.0 < 5.0 vale false
10 > 10 vale false
10 >= 10 vale true
10.0 >= 5.0 vale true
10 == 5 vale false
10 == 10 vale true
10 != 5 vale true
10 != 10 vale false
'a' > 'z' vale false
'a' > 'Z' vale true
'A' > '5' vale true
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 52
Predicati
Le espressioni di tipo boolean sono chiamate
anche predicati (o condizioni)
• i predicati sono espressioni in cui possono apparire
sia operatori relazionali che operatori logici
• ad esempio, il predicato (n>=0) && (n<=10) vale true se
(e solo se) il valore di n è compreso tra 0 e 10
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 53
Variabili boolean
È possibile dichiarare variabili di tipo boolean • le variabili di tipo boolean vanno normalmente documentate con un
commento che descrive la proprietà che è verificata se la variabile assume il valore true
boolean nPari; // n è pari boolean nPositivo; // n è positivo boolean nPariEPositivo; // n è pari e positivo
È possibile assegnare a una variabile boolean il valore (della valutazione) di un predicato
/*n è pari se il resto della divisione per 2 e’ zero */ nPari = (n%2) == 0; nPositivo = n>0;
Nei predicati è possibile usare anche variabili boolean nPariEPositivo = nPari && nPositivo;
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 54
Esercizio
Qual è il valore stampato dal seguente frammento di codice? Perché?
boolean a, b, c; a = true;
b = true;
c = a && !b;
b = (b && c) || (!b && !c);
a = (b && c) || (!b && !c);
c = !(a && b);
if ((a && b && !c) || (a && !b))
System.out.println("Ho capito!");
else
System.out.println("Non ho capito!");
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 55
Espressioni booleane e operatori relazionali
In teoria, è possibile usare gli operatori di uguaglianza (== e !=) per verificare se una certa espressione booleana è vera o falsa
boolean nPari; // n è pari ... if (nPari==true) System.out.println(n + " è pari"); else System.out.println(n + " è dispari");
• Questa modalità di scrittura è assolutamente Sconsigliata!!! è inutile – nPari==true è equivalente a nPari– nPari==false è equivalente a !nPari
• è soggetta a errori (logici, non rilevati dal compilatore) – ad esempio, se si scrive in una condizione nPari=true anziché nPari==true
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 56
Leggi di De Morgan
Le leggi di De Morgan sono delle leggi di dualità tra espressioni che coinvolgono operatori logici
• sono leggi definite per gli operatori logici non condizionali, che valgono anche per gli operatori logici condizionali
Siano b1, b2, ..., bn espressioni di tipo boolean, allora
! ( b1 & b2 & ... & bn ) è equivalente a ! b1 | ! b2 | ... | ! bn
• la negazione di una congiunzione di termini è uguale alla disgiunzione dei termini negati
! ( b1 | b2 | ... | bn ) è equivalente a ! b1 & ! b2 & ... & ! bn
• la negazione di una disgiunzione di termini è uguale alla congiunzione dei termini negati
Ad esempio ! ( (a>=0) && (a<b) ) è equivalente a !(a>=0) | | !(a<b) che è poi anche
equivalente a (a<0) | | (a>=b)
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 57
Esercizio
Sia anno una variabile intera che rappresenta un anno
• scrivere una espressione booleana, in cui compare la variabile anno, che è vera se e solo se anno è bisestile
–normalmente, anno è bisestile se anno è divisibile per 4
–tuttavia, normalmente se anno è divisibile per 100 allora non è bisestile, come nel caso dell’anno 1900
–tuttavia, se anno è divisibile per 400 allora è bisestile, come nel caso dell’anno 2000
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 58
Gli altri tipi primitivi di Java
byte – un intero relativo tra -128 e +127 (8 bit)
short – un intero relativo tra -32768 e +32767 (16 bit)
long – un intero relativo tra -9223372036854775808 e +9223372036854775807 (64 bit)
float – un numero reale in virgola mobile secondo lo standard IEEE 754-1985 a 32 bit (mantissa con 9 cifre significative, ed esponente tra -45 e +38)
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 59
Conversione tra tipi
Talvolta è possibile / necessario effettuare conversioni da un tipo a un altro
• per trasformare la rappresentazione di un valore in un’altra rappresentazione
Ad esempio:si vuole calcolare il cubo di un numero intero.Nelle librerie di java c’è il metodo Math.pow:
static double pow(double a, double b)
Returns the value of the first argument raised to the power of the second argument
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 60
Conversione implicita
Si consideri il seguente frammento di codice
int intero; // un valore intero
double reale; // un valore reale
... assegna un valore a intero ...
reale = intero;
• questa assegnazione è corretta? – sì, è possibile assegnare un valore intero a una variabile di tipo double
• che cosa vuole dire questa assegnazione? – il valore di intero (come sequenza di bit) non può semplicemente essere trascritto
nella variabile reale – bisogna prima convertire il valore di intero a un valore equivalente di tipo double – si tratta di una conversione implicita o promozione
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 61
Assegnazioni e conversioni implicite
Una assegnazione
variabile = espressione • è valida se
– variabile ed espressione hanno lo stesso tipo, oppure se – il tipo di variabile è “più ampio” di quello di espressione
• in quest’ultimo caso – la semantica dell’assegnazione consiste nella valutazione di espressione, nella
conversione implicita del valore calcolato al tipo di variabile e in una assegnazione a variabile
intero = 10; reale = intero; /* ora reale vale 10.0 */ • Le conversioni implicite vengono effettuate anche in altri casi • Math.sqrt(144) • 7.0/2
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 62
Conversione esplicita
Si consideri il seguente frammento di codice
int intero; // un valore intero
double reale; // un valore reale
... assegna un valore a reale ...
intero = reale;
• questa assegnazione è corretta? – no, il tipo di intero non è più ampio di quello di reale
• posso voler effettuare una assegnazione di questo tipo? – in alcuni casi
• con quale significato? – arrotondando il valore di reale a un intero – nel modo migliore possibile
• è necessaria una conversione esplicita– perché è possibile la perdita di precisione
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 63
Conversione esplicita e cast
Se T è un tipo, allora la forma sintattica
(T )
è un operatore unario – operatore di cast - che indica una conversione di un valore al tipo T
reale = 10.8;
intero = (int) reale;
/* ora intero vale 10 */
• la conversione viene effettuata perdendo di precisione – in questo caso, arrotondando per difetto
http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni 64
Esercizi
Si vuole calcolare il cubo di un numero intero
int num;
int cubo;
cubo = (int) Math.pow(num,3.0); Siano:
double a=3.0; int b=2; int c=10;
Quale valore calcola l’espressione c/b+b*a ? Trasformare un carattere minuscolo nel relativo
carattere maiuscolo Trasformare un carattere maiuscolo nel relativo
minuscolo
Riepilogo della dispensa…
La nozione dei tipi di dato nei linguaggi di programmazione e’ simile a quella delle strutture algebriche: elementi del dominio e operatori definiti sul dominio dato.
Tutti gli elementi del linguaggio sono caratterizzati da un tipo di dato
Due categorie di tipi di dato: tipi primitivi (int, byte, short, long, char, float, double, boolean) e tipi riferimento (String, tutte le classi)
Anche un’espressione e’ caratterizzata da un tipo, che viene definito sulla base del tipo con il dominio piu’ ampio tra il dominio degli operandi cui il tipo appartiene.
65http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione
…Riepilogo della dispensa
Le espressioni vengono valutate secondo la precedenza degli operatori presenti (a parita’ vengono valutate da sinistra verso destra). Le parentesi modificano la priorita’ degli operatori.
Anche = e’ un operatore: l’operatore di assegnazione. Gli operatori si dicono sovraccarichi quando sono definiti per diversi
tipi di dato. Quando in una espressione compaiono operandi di tipi diversi, tra loro compatibili, il tipo dell’espressione e’ determinato dal tipo con il dominio piu’ grande, tra quelli presenti. In questo caso tipi con il domino piu’ piccolo vengono trasformati in tipi con il dominio piu’ grande e poi viene realizzata la valutazione dell’espressione. In questo caso avviene una conversione impliicita.
La conversione esplicita puo’ essere solo realizzata dall’utente che prevede un eventuale troncamento nel valore del dato che, essendo diventando elemento di un domnio piu’ piccolo, potrebbe perdere delle infomrazioni.
66http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione
67
Conoscenze acquisite
Analogia tra il tipo di dato e la classe
Tipi primitivi di Java
Differenza nella rappresentazione dei diversi tipi primitivi
Alcuni operatori hanno un significato diverso in corrispondenza dei tipi degli operandi su cui operano
Espressioni e loro valutazione
Cast impliciti ed espliciti tra tipi diversi
http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione
68
Competenze acquisite
Applicare correttamente operatori coerenti con diversi tipi di dato
Gestire le espressioni formate da diversi tipi di dato avendo in mente La precedenza tra gli operatori Il modo in cui vengono valutate le espressioni Sapendo gestire gli operatori sovraccarichi
Effettuare conversioni esplicite e sapere quando si verificano le conversioni implicite
http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione
69
Parole chiave
Tipi di dato primitivi/riferimento Rappresentazione, interpretazione, dominio, operatori Variabili, costanti, parametri Opratori relazionali, operatori logici, predicati Espressioni, operatori sovraccarichi, cast, conversioni
esplicite/implicite
http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione
70
Rifermimenti al libro di testo
Per lo studio di questi argomenti si fa riferimento al
libro di testo, e in particolare al capitolo 11 – Tipi ed
espressioni
http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione
71
Esercizi di autovalutazione
Vedi sul sito: 04-autovalutazione.doc
http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione