Espressioni e Operatori - INTRANET · 2002-05-21 · Lezione 4 Espressioni ed operatori Laboratorio...
Transcript of Espressioni e Operatori - INTRANET · 2002-05-21 · Lezione 4 Espressioni ed operatori Laboratorio...
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 1
Lezione 4
Espressioni e Operatori
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
1
Espressioni
ü Un’espressione è formata da una o più operazioniü Le operazioni sono rappresentate da operandi ed
operatori® operatore = simbolo che identifica l’operazione® operando = argomento su cui deve essere eseguita l’operazione
a + b;
ü Gli operatori del C++ sono unari, binari o ternari
®gli operandi di un operatore binario sono distinti in operando sinistro (primo argomento dell’operatore) e operando destro (secondo argomento dell’operatore)
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 2
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
2
Valutazione delle Espressioni
üLa valutazione di un’espressione richiede l’esecuzione di una o più operazioni® L’ordine in cui vengono considerati gli
operatori e gli operandi dipende dalle regole di precedenza e di associatività
ü Il risultato dell’espressione è (quasi sempre) un R-value
ü Il tipo del risultato dipende dal tipo degli operandi dell’espressione
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
3
Operatori Aritmetici
ü Gli operatori aritmetici sono +, -, *, /, %
ü Il tipo del risultato di un’operazione aritmetica è uguale al tipo dell’operando più grande
2 * 3.5 // risultato è double7 / 3; // risultato è intero (2)
21 % 3; // risultato è intero (0)21 % 3.5; // ERRORE
Possono verificarsi errori di eccezione aritmetica®divisione per 0, underflow, overflow
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 3
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
4
Operatori Logico-Relazionali
ü Gli operatori logico-relazionali sono
>, <, >=, <=, ==, !=, &&, ||, !ü restituiscono un risultato di tipo vero-falso
® un’espressione è falsa se vale 0, vera altrimenti
ü Gli operatori logici vengono valutati da sinistra a destra ® la valutazione termina non appena è stato determinato il valore
dell’espressione
expr1 || expr2; // expr2 non valutata se expr1 è vera
!strcmp(s, t); // equivalente a (strcmp(s, t) == 0)
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
5
Esempio Operatori RelazionaliConta quanti elementi di ivec sono minori del valore di soglia
#include <vector>int conta(const vector<int>& ivec, int soglia){
int cnt = 0;vector<int>::iterator iter = ivec.begin();while(iter != ivec.end() ) {
cnt = cnt + (*iter < soglia);++iter;
}return cnt;
}
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 4
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
6
Utilizzo dei Controlli di Sentinella – 1
üCi sono situazioni in cui un'operazione è legale solo se alcune precondizioni sono verificate® Dereferenziazione di un puntatore w solo se il puntatore non è 0
® Accesso ad un elemento di un array w solo se l'indice è corretto
® Divisione w solo se il divisore è diverso da 0
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
7
Utilizzo dei Controlli di Sentinella – 2
ü Se le precondizioni non sono soddisfatte si verifica un comportamento anomalo del programma
ü Si possono usare gli operatori logici per effettuare queste operazioni solo se le precondizioni sono verificate
int *ptr = 0, i;(ptr) && (i = *ptr);
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 5
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
8
Operatori di Assegnamento – 1
üL’operatore di assegnamento è =® L'operatore di assegnamento modifica il
valore di una variabile (la variabile aveva gia un valore)
® L'operatore di inizializzazione assegna un valore ad una variabile appena creata
üL’operando di destra è un R-value e l’operando di sinistra è un L-value
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
9
Operatori di Assegnamento – 2 ü Il risultato di un assegnamento è l’R-value
dell’operando destro
ü Il tipo dell’assegnamento è il tipo dell’operando sinistro
int i, *ip, ia[4] = {0}, j;i = ia[0] + 1; // risultato 1, intero
int *ip = &j;*ip = i*2 + ia[i]; // risultato 2, intero
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 6
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
10
Operatori di Assegnamentoü È possibile concatenare operazioni di
assegnamento se tutti gli operandi a cui si devono assegnare valori sono dello stesso tipoint i, j;i = j = 0; // CORRETTOint i = j = 0; // ERRORE
ü L’operatore di assegnamento composto permette di compattare la notazione
a op= b; ==> a = a op b;ü È possibile comporre
+, -, *, /, %, &, |, <<, >>, ^
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
11
Operatori di Incremento e Decremento
ü Gli operatori di incremento e decremento sono ++ , --i++ ===> i = i + 1;i-- ===> i = i - 1;
ü Esistono due versioni dello stesso operatore® ++i prima incrementa il valore di e poi lo legge® i++ prima legge il valore di i e poi lo incrementa
int i = 0, ia[3] = { 0, 1, 2 };int c = ia[i++]; // c = 0, i = 1c = ia[++i]; // i = 2, c = ia[2]
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 7
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
12
Operatore sizeofü L’operatore sizeof restituisce la dimensione in byte di
un oggetto o di un tipo® Il risultato di un sizeof è di tipo size_t (tipo dipendente dalla
macchina definito nell'header file cstddef)® Il risultato di un sizeof è una costante
sizeof( expr ); // dimensione del tipo di exprsizeof epxr;sizeof( int ); // dimensione di int
ü L’operatore sizeof applicato ad un array restituisce il numero di byte occupati dall’array
int ia[] = { 0, 1, 2 };sizeof( ia ) / sizeof( int ); // il risultato è 3
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
13
Operatore Condizionale – 1
üL’operatore condizionale (if aritmetico) è l’unico operatore ternario del C++
üLa sintassi è expr1 ? expr2 : expr3;
® se expr1 è vera il risultato è expr2, altrimenti è expr3
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 8
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
14
Operatore Condizionale – 2
#include <iostream>main() { // calcola parità
int i;cout << “dammi un intero” << endl;cin >> i;cout << i << “ è “ ;cout << (i % 2) ? “dispari” : “pari” << endl;
}
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
15
Operatore Virgola
ü La virgola serve a separare sotto-espressioni
ü Un espressione formata da sotto-espressioni separate da virgole ha come risultato il valore dell’ultima sotto-espressione
int ia[3], m[3][4];int i = ( ia != 0 ) ? ia[1]++, 1 : 0;m[1, 2] = 100; // dove abbiamo scritto?
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 9
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
16
Operatori ai Bitü Gli operatori ai bit sono %, |, ,̂ ~, <<, >>
® Leggono gli operandi come sequenze di bit® Possono operare su uno (o più) specifico bit® Il controllo sulla correttezza delle operazioni è delegato
completamente al programmatore
ü Gli operandi sono detti bitvector® Utilizzati per rappresentare in modo compatto insiemi di flag® Sono di tipo intero (int, short, long, char)
® È consigliabile che siano unsigned
ü Nella libreria iostream i bitvector sono usati per rappresentare il formato del flusso (tipo di rappresentazione, numero di cifre decimali, etc.)
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
17
Esempio Operatori ai Bit
unisgned char i = 101; // 01100101 unsigned char j = 151; // 10010111
j = ~j; // 01101000 (104)j << 1; // 11010000 (208)j >> 2; // 00110100 (52)j &= i; // 00100100 (36)j ^= i; // 01000001 (65)j |= i; // 01100101 (101)
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 10
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
18
Classe bitset
ü La libreria standard fornisce la classe bitsetche implementa il tipo di dati astratto “sequenza di bit”® Fornisce operazioni per manipolare e testare insiemi
di bit, indipendenti dalla rappresentazione dei bit
ü Definizione di variabili bitset
bitset<24> bitvec;
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
19
Principali operazioni su bitset
test(pos) // controlla se il bit pos è 1any() // controlla se qualche bit è 1none() // controlla se nessun bit è 1count() // conta quanti bit sono 1size() // conta quanti sono i bit[pos] // accedi al bit posflip(pos) // inverte il bit posset(pos) // mette a 1 il bit posreset(pos) // mette a 0 il bit pos
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 11
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
20
Conversioni di oggetti bitset
üÈ possibile convertire oggetti bitset in altri tipi:® string con la funzione to_string()
® unsigned long con la funzione to_long()
üQueste conversioni sono utili per passare oggetti bitset a funzioni C o C++ pre-standard che non conoscono la classe bitset
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
21
Esempio uso classe bitset
#include <bitset>bitset<32> bitvec(0xFFFF); // crea un bitset di 32 bitbool is_set = bitvec.any();int count;if(is_set) // se c'è un bit a 1 conta quanti bit sono a 1
count = bitvec.count(); else
bitvec.flip(); // inverte tutti i bitfor(int i = 0; i<bitvec.size(); i++)
if(i % 2) // setta a 1 i bit di posizione pari bitvec.set(i);
elsebitvec.reset(i); // e a 0 gli altri
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 12
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
22
Espressioni New e Deleteü Ad ogni programma è assegnata una porzione di
memoria utilizzabile in fase di esecuzioneü Per allocare la memoria si utilizza l'espressione new
int* pi = new int(10); // alloca un int e lo inizializza con 10
int* pia = new int[4];// alloca un vettore di interi con 4 elementi
ü Gli oggetti allocati dinamicamente non hanno nome e devono essere referenziati tramite puntatori
ü Per rilasciare la memoria dinamica si utilizza l'espressione delete
delete pi; //Cancella la memoria allocata a pidelete [] pia; //Cancella il vettore allocato a pia
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
23
Operazioni di Input/Output
ü Il C++ non prevede nessun operatore per effettuare operazioni di input/output® La libreria standard fornisce classi e operatori che permettono
di effettuare operazioni di input/output (iostream)
ü I dispositivi di input/output sono rappresentati dall'astrazione di flusso (stream) ® cin è un oggetto istream che identifica lo standard input® cout è un oggetto ostream che identifica lo standard output
ü L'operatore << inserisce un oggetto nel flusso di outputü L'operatore >> estrae un oggetto dal flusso di input
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 13
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
24
Regole di Precedenza
ü La sintassi del C++ definisce delle regole di precedenza tra gli operatori che vengono utilizzate per valutare espressioni composte® un’espressione composta è valutata considerando prima gli
operatori con più alta precedenza, in ordine da sinistra a destra
6+3*4/2+2; // 6+((3*4)/2)+2 = 14while(ch = nextChar() != '\n') // che fa?
ü È possibile modificare l’ordine di valutazione degli operatori utilizzando le parentesi® una coppia di parentesi individua una sotto-espressione ® la valutazione di una sotto-espressione ha massima
precedenza
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
25
Regole di Associatività
ü Per ogni operatore è definito un livello di precedenza ed un tipo di associatività ® Associatività a destra o a sinistra
ü La regola di associatività specifica come viene interpretata un'espressione in cui compare più volte lo stesso operatore® Associatività a destra
i = j = k = 1; // (i = (j = (k = 1)))
i + j + k; // (i + j) + k)
® Associatività a sinistra
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 14
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
26
Regole di Conversione di Tipo
üQuando in un’espressione sono presenti operandi di tipo diverso il programma deve operare delle conversioni di tipo
üUna conversione di tipo non provoca alterazioni nel contenuto della memoria® Modifica solo il tipo di un dato
üEsistono tre tipi di conversioni® Implicite, aritmetiche ed esplicite
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
27
Regole di Conversione Implicita
ü Le conversioni implicite sono eseguite automaticamente dal compilatore
ü Le conversioni implicite sono eseguite secondo regole dette conversioni standard
ü Il programma può introdurre proprie regole di conversione standard (ma non per i tipi predefiniti)
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 15
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
28
Regole di Conversione Implicita
ü In un assegnamento si converte automaticamente l’R-value dell’operando destro al tipo dell’operando sinistro
ü Il tipo della variabile passata ad una funzione viene convertito nel tipo dell’argomento della funzione
ü Il tipo dell'oggetto restituito dal return è convertito nel tipo del risultato della funzione
ü Tutte queste conversioni sono realizzate con la creazione di variabili temporanee
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
29
Regole di Conversione Aritmeticaü Le conversioni aritmetiche garantiscono che gli
operandi di un operatore binario siano dello stesso tipo® Tutti gli operandi sono convertiti nel tipo
dell’operando più grande
ü Le regole sono® Ogni operando può essere solo promosso® Tutti gli operandi più piccoli di un int sono sempre promossi
ad int prima di essere valutati
ü Promuovere un operando char a int significa® Leggere il valore ASCII del char® Copiarlo in una variabile int temporanea
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 16
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
30
Regole di Conversione Esplicitaü Viene effettuata attraverso l’operazione di cast
tipo_cast<tipo>(expr);® L'operazione di cast è pericolosa perché aggira il sistema di
controlli sui tipi del compilatore
ü Non tutti i cast sono sicuri® La conversione di un tipo in un tipo più piccolo è non sicura
perché tronca la rappresentazione del dato
ü Il compilatore non esegue mai automaticamente un cast non sicuro
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
31
Utilizzo dei Cast
üReferenziare puntatori generici (void)üEvitare delle conversioni inutili nella
valutazione di un’espressioneüScavalcare il controllo sui tipi predisposto
dal compilatoreüEliminare ambiguità nella valutazione di
un’espressione® se più conversioni implicite sono possibili il
compilatore non sceglie e segnala un errore di ambiguità
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 17
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
32
Tipi di Cast
ü Il C++ standard distingue 4 diversi tipi di cast, a seconda dell'utilizzo® Solo per migliorare la leggibilità del codice
const_cast<T>(expr); // rende expr (non) costantestatic_cast<T>(expr); // trasforma il tipo di expr in Treinterpret_cast<T>(expr);
/* legge il pattern di bit all'indirizzo di expr come se fosse di tipo T */
dynamic_cast<T>(expr)/* implementa il run time type identification */
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
33
Cast C-styleü Nel C++ pre-standard esisteva un solo di tipo di cast
T (expr);(T) expr; // converte il tipo di expr a Tint (3.14); // tronca la parte decimale(short) 123456l;
// tronca la rappresentazione del numero
ü Per motivi di compatibilità, nello standard è ancora supportato questo tipo di cast, ma ne è deprecato l'uso
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 18
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
34
Istruzioni
ü Un’istruzione è la più piccola unità di codice eseguibile di un programma C++® Ogni istruzione è caratterizzata da un ; come carattere finale
ü Un’istruzione composta è formata da più operazioni elementari® un’operazione composta è racchiusa tra {} e non è seguita dal ;
ü Un’istruzione composta può sostituire un’istruzione semplice
ü Un blocco è un’istruzione composta che contiene definizioni
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
35
Istruzioni di Dichiarazione
ü Dichiarano o definiscono una variabile® Possono comparire in qualunque punto del codice
ü Il C++ incoraggia a definire le variabili solo nel momento in cui servono® Evita di definire variabili non inizializzate® Evita inutili inizializzazioni® Consente di allocare memoria solo alle variabili realmente
utilizzate
ü È possibile definire variabili nella linea di controllo di un'istruzione di controllo del flusso® La variabile è visibile solo all'interno del blocco associato
all'istruzione
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 19
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
36
Istruzioni di Controllo del Flusso
üL’ordine di esecuzione delle istruzioni di un programma è sequenziale, a partire dalla prima linea della funzione main()
üLe istruzioni di controllo del flusso servono a modificare l’ordine di esecuzione delle istruzioni del programma
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
37
if then else
ü L’if è un’istruzione condizionale che permette di scegliere tra al più due casi
if (expr) ist1;
else ist2;
ü Istruzioni di if annidate sono fonti di potenziali errori
– dangling else
® se expr è vera viene eseguita ist1, altrimenti viene eseguita ist2
® l'istruzione ist è eseguita solo se expr è vera
if (expr) ist;
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 20
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
38
switchü Lo switch è un’istruzione condizionale che
permette di scegliere tra più casi
switch (expr) {case i:
ist-i;break;
case j:ist-j;break;
default:ist;
}
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
39
while
ü Il while è un’istruzione di ciclo
while (expr) ist;
®esegue ist fino a quando expr è vera
ü L’ordine di esecuzione è®1) valuta expr®2) se expr è vera esegui ist e torna ad 1®3) esegui la prossima istruzione
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 21
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
40
for
ü Il for è un’istruzione di ciclofor( ist_iniz; expr1; expr2)
ist;
®esegue ist_iniz, quindi esegue ist e expr2 fino a quando expr1 è vera
ü L’ordine di esecuzione è® 1) esegui ist_iniz® 2) valuta expr1® 3) se expr1 è vera esegui prima ist, poi expr2 e torna a 2)® 4) esegui prossima istruzione
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
41
do while
ü Il do è un’istruzione di ciclo
®esegue ist fino a quando expr non diventa falsa®almeno una volta l’istruzione ist viene eseguita
ü L’ordine di esecuzione è® 1) esegui ist® 2) valuta expr® 3) se expr è vera torna a 1), altrimenti esegui prossima
istruzione
do ist;
while (expr);
Lezione 4Espressioni ed operatori
Laboratorio di Algoritmi e Strutture Dati 2001/02 22
Labo
rato
rio d
i Alg
oritm
i e S
trut
ture
Dat
i 200
1-02
42
Salti
ü Le istruzioni di salto spostano il controllo del programma
ü Esistono tre istruzioni di salto® breakw interrompe il ciclo che si sta eseguendo
® continuew interrompe l’iterazione del ciclo che si sta eseguendo
® goto labelw salta incondizionatamente all’istruzione etichettata labelw label deve stare nella stessa funzione che contiene goto