1 / 28

Laboratorio di Linguaggi lezione IX

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. -. +. *. /. %. -. >>. <<. &. |. +.

marin
Download Presentation

Laboratorio di Linguaggi lezione IX

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2004/05 Laboratorio di Linguaggilezione IX Marco Tarini

  2. Espressioni e operatori operatori su numeri - + * / % - >> << & | + operatori relazionali binari unari != == >= <= > < operatori logici (booleani) != == || && ! 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  3. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  4. Assegnamenti • Assegnamento base = <left value> = <expr> 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  5. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  6. Left values: oggetti dotati di indirizzo • Esempi: • quali sono left values? const int N=5; int v[15]; int x,y; int * p; Persona r; v[3] p x *((&x)+2) *p x/5 r v[3+x] 5 N &x r.nome *(p+10) (*p) + 10 r.eta + 5 v[x]+3 5+x &p &x + 2 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  7. 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 & 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  8. Operatori unari di modifica -= += *= /= %= operatori di modifica (scorciatoie sintattiche) >>= <<= &= |= x+=3; x=x+3; x>>=1; x = x >> 1; operatori su numeri - + * / % - >> << & | + operatori relazionali binari unari != == >= <= > < operatori logici (booleani) != == || && ! 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  9. Operatori unari di modifica 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 ") • incremento - decremento x++ x-- ++x --x 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  10. Assegnamenti 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! • Assegnamento base = <left value> = <expr> 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  11. Assegnamenti expr di tipo T0 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! • Assegnamento base x = y = z = 10; = <left value> = <expr> 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  12. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  13. Esercizio: alcune soluzioni 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) { ... } } typedef enum {FALSE, TRUE} Bool; • soluzione 1: • soluzione 2: • soluzione 3: typedef int Bool; const Bool TRUE = 1; const Bool FALSE = 0; #defineBool int #defineTRUE 1 #define FALSE 0 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  14. E' gia' una micro-libreria ! #include "bool.h" #include "bool.h" file "bool.h" 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) { ... } } 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  15. Inclusione files "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 nelleapposite "directoriesdi libreria") Due sintassi diverse per "includere" un file #include "bool.h" #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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  16. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  17. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  18. Definizioni e dichiarazioni lista dei parametri formali, ciascuno preceduto dal tipo (input della funzione) nome (identificatore) della funzione: “potenza” tipo del risultato: intero (output della funzione) variabili locali • qui, due • visibili solo nel corpo della funzione. • dichiarate all’inizio! corpo della funzione “cosa fa” un blocco delimitato da {} comando “return”: restituzione del risultato, e uscita dalla funzione ci deve essere! int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  19. Definizioni e dichiarazioni 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" int potenza (int b, int e); int potenza (int b, int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  20. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  21. Definizioni e dichiarazioni errore in compilazione: identificatore sconosciuto: "potenza" • 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; } 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  22. Definizioni e dichiarazioni (i nomi dei parametri formali si possono anche omettere) • 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; } 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  23. Progetti a piu' files • Schema file "potenze.h" int potenza(int b,int e); file "potenze.c" int potenza(int b,int e) { int res=1 , i; for (i=1; i<=e; i++) { res = res * b; } return res; } #include "potenze.h" file "main.c" #include "potenze.h" 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  24. Struttura della compilazione main.c file precomp. 1 object file main.o pre- process. compiler eseguibile finale exec.exe potenze.h linker potenze.c file precomp. 3 object file potenze.o pre- process. compiler 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  25. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  26. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  27. 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  28. Con DevC++ Ripentendo per potenza.h si ottiene: nota: "compile" VS "build" (anche: "make") 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 ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

More Related