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