Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2004/05 Laboratorio di Linguaggi lezione IX Marco Tarini Espressioni e operatori operatori su numeri - + >> * / % - & | + << != == >= <= > < binari unari operatori relazionali operatori logici (booleani) != == || && Marco Tarini ‧ Laboratorio di Linguaggi ‧ ! 2004/05 ‧ Università dell’Insubria Operatori Logici • In C la semantica degli operatori logici e' lazy if ((x<5)&&(fscanf(f,"-%c",&c)) ) { ... } Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Assegnamenti • Assegnamento base = <left value> = <expr> Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Left values: oggetti dotati di indirizzo • Cosa e’ un “left value” – – – – una variabile una espressione di tipo puntatore... deferenziata un elemento di un vettore un campo di una variabile di tipo struct • Non sono left values: – qualunque altra espressione – (costanti, risultati di operazioni, etc) • Test mentale: – posso metterla a sinistra di un assegnamento? Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Left values: oggetti dotati di indirizzo • Esempi: const int N=5; int v[15]; int x,y; int * p; Persona r; – quali sono left values? v[3] p x *((&x)+2) v[3+x] *p x/5 r 5 N &x r.nome v[x]+3 *(p+10) (*p) + 10 r.eta + 5 5+x &p &x + 2 x + y Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Left values: • Solo un left-value puo' : – essere usato a sx di un assegnamento – subire l’operatore & – subire operatori di modifica • che mutano il valore Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Operatori unari di modifica operatori su numeri - + * >> << / % - & | + %=relazionali *=operatori /= operatori di modifica (scorciatoie sintattiche) >>= <<= &= |= < != == >= <= > += binari unari -= x+=3; operatori != x>>=1; == x=x+3; logici (booleani) || && x = x >> ! 1; Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Operatori unari di modifica • incremento - decremento l'espressione vale il valore non ancora incrementato / decrementato ("prima usa il valore, poi incrementa / decrementa la variabile") x++ x-- ++x --x l'espressione vale il valore già incrementato / decrementato ("prima incrementa / decrementa la variabile, poi usa il valore ") Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Assegnamenti • Assegnamento base = <left value> = <expr> tipo T0 tipo T1 typecast automatico se T0 diverso da T1 (ma solo se esiste una conversione automatica). Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Assegnamenti • Assegnamento base x = y = z = 10; = expr di tipo T0 <left value> = <expr> tipo T0 tipo T1 typecast automatico se T0 diverso da T1 (ma solo se esiste una conversione automatica). Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Esercizio • Non esiste il tipo bool • Come si puo’ fare ad aggiungerlo? – in modo che sia possibile scrivere, per esempio: Bool b; int x; Bool b0,b1,b2 = TRUE; int main(){ b = ( x == 0); if (b) { ... }; b = !b; } int main(){ ... b0 = b1 && b2; while (b0) { ... } } Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Esercizio: alcune soluzioni • soluzione 1: typedef enum {FALSE, TRUE} Bool; • soluzione 2: typedef int Bool; const Bool TRUE = 1; const Bool FALSE = 0; • soluzione 3: #define Bool int #define TRUE 1 #define FALSE 0 Bool b; int x; int main(){ b = ( x == 0); if (b) { ... }; b = !b; } Marco Tarini ‧ Laboratorio Bool b0,b1,b2 = TRUE; int main(){ ... b0 = b1 && b2; while (b0) { ... } } di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria E' gia' una micro-libreria ! file "bool.h" typedef enum {FALSE, TRUE} Bool; #include "bool.h" #include "bool.h" Bool b; int x; Bool b0,b1,b2 = TRUE; int main(){ b = ( x == 0); if (b) { ... }; b = !b; } int main(){ ... b0 = b1 && b2; while (b0) { ... } } Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Inclusione files Due sintassi diverse per "includere" un file #include "bool.h" "inserisci un file che fa parte di questo progetto" (il file verrà cercato nella directory corrente) #include <bool.h> "inserisci una una libreria esterna" (il file verrà cercato nelle apposite "directories di libreria") Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Inclusione files Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Diamo una occhiata Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Definizioni e dichiarazioni tipo del risultato: intero (output della funzione) corpo della funzione “cosa fa” un blocco delimitato da {} nome (identificatore) della funzione: “potenza” lista dei parametri formali, ciascuno preceduto dal tipo (input della funzione) int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } variabili locali • qui, due • visibili solo nel corpo della funzione. • dichiarate all’inizio! comando “return”: restituzione del risultato, e uscita dalla funzione ci deve essere! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Definizioni e dichiarazioni dichiarazione della funzione int potenza (int b, int e); o prototipo della funzione - "tutto quello che serve sapere per usare la funzione (a scatola chiusa)" int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } Marco Tarini ‧ Laboratorio di Linguaggi ‧ definizione della funzione o implementazione della funzione - "le istruzioni dettagliate per eseguire la funzione" 2004/05 ‧ Università dell’Insubria Definizioni e dichiarazioni • Esempio int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } int main(){ int x; x = potenza(5, 6); } Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Definizioni e dichiarazioni • Esempio: invertiamo l'ordine per capriccio int main(){ int x; x = potenza(5, 6); } errore in compilazione: identificatore sconosciuto: "potenza" int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Definizioni e dichiarazioni • Esempio (i nomi dei parametri formali si possono anche omettere) int potenza (int b , int e ); int main(){ int x; x = potenza(5, 6); } int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Progetti a piu' files • Schema file "potenze.h" int potenza(int b,int e); file "main.c" #include "potenze.h" int main(){ int x; x = potenza(5, 6); } Marco Tarini ‧ Laboratorio di Linguaggi ‧ file "potenze.c" #include "potenze.h" int potenza(int b,int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } 2004/05 ‧ Università dell’Insubria Struttura della compilazione main.c preprocess. file precomp. compiler 1 object file main.o potenze.h prepotenze.c process. linker file precomp. compiler 3 Marco Tarini ‧ Laboratorio di Linguaggi ‧ eseguibile finale exec.exe object file potenze.o 2004/05 ‧ Università dell’Insubria Con DevC++ • Tasto destro sul progetto Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Con DevC++ Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Con DevC++ Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Con DevC++ Ripentendo per potenza.h si ottiene: nota: "compile" VS "build" (anche: "make") Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria