Tipi ed espressioni - Dipartimento di Informatica e Automazione

Corso di Laurea Ingegneria Informatica
Fondamenti di Informatica 1
Dispensa 5
Tipi ed espressioni
Carla Limongelli
Settembre 2007
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
1
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/fondinf1/
Tipi ed espressioni
2
Prerequisiti
Questo capitolo presuppone la conoscenza degli
argomenti già trattati nelle precedenti lezioni di
questo corso e del corso di Laboratorio di
Informatica e di Combinatoria e Matematica
Discreta, con particolare riferimento a
„
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/fondinf1/
Tipi ed espressioni
3
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
Z
R
…,-3,-2,-1,0,1,2,3,…
{ +, -, *, div, mod }
…,-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
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
4
. . . 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/fondinf1/
Tipi ed espressioni
5
Tipi, classi e oggetti
‰Una classe è
caratterizzata da:
‰Un tipo è
caratterizzato da:
ƒ Un insieme di elementi
della classe (oggetti)
ƒ Un insieme di
operazioni (metodi)
che possono essere
eseguite sugli elementi
• Nomi di metodi
ƒ 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/fondinf1/
Tipi ed espressioni
6
Rappresentazione e interpretazione
0011 = R(3) , 0100 = R(4) , 0111 = R(7)
3 = I (0011) , 4 = I (0100) , 7 = I (0111)
3, 4
7
+
R
I
I
R
+
0011, 0100
http://www.dia.uniroma3.it/~java/fondinf1/
0111
Tipi ed espressioni
7
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 oggetti
‰I tipi sono anche importanti per
ƒ stabilire la modalità di memorizzazione dei valori
delle variabili
ƒ stabilire il significato degli operatori
ƒ rivelare eventuali errori nell’uso di variabili, operatori
e invocazioni di metodi
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
8
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/fondinf1/
Tipi ed espressioni
9
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/fondinf1/
Tipi ed espressioni
10
Il tipo int: Rappresentazione e Dominio
‰Il tipo int di Java ha una rappresentazione a 32
bit in complemento a 2: Rappresentazione
modulare
‰Il 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/fondinf1/
Tipi ed espressioni
11
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
– 11 / 2
– -11 / 2
vale 5
vale 5 — e non vale 5.5
vale - 5
• l’operatore % rappresenta il resto della divisione intera
10 % 2
13 % 5
vale 0
vale 3
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
12
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/fondinf1/
Tipi ed espressioni
13
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/fondinf1/
Tipi ed espressioni
14
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/fondinf1/
Tipi ed espressioni
15
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/fondinf1/
Tipi ed espressioni
16
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/fondinf1/
Tipi ed espressioni
17
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/fondinf1/
Tipi ed espressioni
18
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/fondinf1/
Tipi ed espressioni
19
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/fondinf1/
Tipi ed espressioni
20
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/fondinf1/
Tipi ed espressioni
21
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/fondinf1/
Tipi ed espressioni
22
… 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/fondinf1/
Tipi ed espressioni
23
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/fondinf1/
Tipi ed espressioni
24
Valutazione delle espressioni
‰Qual è il risultato delle seguenti espressioni?
6+2+1
2*3+4
4+2*3
6-2-1
vale 9
vale 10 — oppure 14?
vale 10 — oppure 18?
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/fondinf1/
Tipi ed espressioni
25
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
+
secondo operatore a
essere valutato
4
*
2
http://www.dia.uniroma3.it/~java/fondinf1/
primo operatore a
essere valutato
Tipi ed espressioni
3
26
Associatività degli operatori
‰L’associatività degli operatori permette di
stabilire l’ordine di applicazione tra operatori che
hanno la stessa precedenza
ƒtutti 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)
secondo operatore a
–
essere valutato
primo operatore a
–
1
essere valutato
6
http://www.dia.uniroma3.it/~java/fondinf1/
2
Tipi ed espressioni
27
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
• 6-(2-1)
vale 18
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/fondinf1/
Tipi ed espressioni
28
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/fondinf1/
Tipi ed espressioni
29
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/fondinf1/
Tipi ed espressioni
30
Operatori di incremento e decremento
‰Due operazioni molto comuni sono l’incremento
e il decremento di uno di una variabile intera
a = a+1;
b = b-1;
// equivalente a:
// equivalente a:
a +=1
b -=1
‰Queste operazioni sono molto comuni, e per
questo motivo Java fornisce gli operatori di
incremento ++ e decremento – –
a++;
b--;
// equivalente a:
// equivalente a:
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
a +=1
b -=1
31
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 è
reali
• 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/fondinf1/
Tipi ed espressioni
32
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
(almeno) un
operando è di
tipo double,
pertanto vengono
interpretati come
operatori razionali 1.0
http://www.dia.uniroma3.it/~java/fondinf1/
+
/
/
2
1
Tipi ed espressioni
2
entrambi gli
operandi sono di
tipo int, pertanto
viene interpretato
come operatore
intero
33
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/fondinf1/
Tipi ed espressioni
34
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/fondinf1/
Tipi ed espressioni
35
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/fondinf1/
Tipi ed espressioni
36
Il tipo boolean
‰Rappresentazione
ƒ Concettualmente … 1 bit
‰Dominio
ƒ Due elementi: true (vero), false (falso)
‰Operatori
ƒ And:
ƒ Or:
ƒ Not:
&, &&
I, II
!
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
37
Algebra di Boole e tipo primitivo boolean
‰Un tipo di dato molto importante ed 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/fondinf1/
Tipi ed espressioni
38
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/fondinf1/
Tipi ed espressioni
39
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/fondinf1/
Tipi ed espressioni
40
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/fondinf1/
Tipi ed espressioni
41
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/fondinf1/
Tipi ed espressioni
42
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/fondinf1/
Tipi ed espressioni
43
Operatori relazionali
‰Ad esempio
10 > 5
10.0 < 5.0
10 > 10
10 >= 10
10.0 >= 5.0
10 == 5
10 == 10
10 != 5
10 != 10
'a' > 'z'
'a' > 'Z'
'A' > '5'
vale true
vale false
vale false
vale true
vale true
vale false
vale true
vale true
vale false
vale false
vale true
vale true
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
44
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/fondinf1/
Tipi ed espressioni
45
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/fondinf1/
Tipi ed espressioni
46
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/fondinf1/
Tipi ed espressioni
47
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/fondinf1/
Tipi ed espressioni
48
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/fondinf1/
Tipi ed espressioni
49
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/fondinf1/
Tipi ed espressioni
50
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/fondinf1/
Tipi ed espressioni
51
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/fondinf1/
Tipi ed espressioni
52
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/fondinf1/
Tipi ed espressioni
53
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/fondinf1/
Tipi ed espressioni
54
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/fondinf1/
Tipi ed espressioni
55
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/fondinf1/
Tipi ed espressioni
56
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
http://www.dia.uniroma3.it/~java/fondinf1/
Tipi ed espressioni
57
Cosa abbiamo imparato
‰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/fondinf1/
Tipi ed espressioni
58
Riferimenti 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/fondinf1/
Tipi ed espressioni
59