Laboratorio di Linguaggi lezione IX Marco Tarini Università dellInsubria Facoltà di Scienze...

Post on 01-May-2015

220 views 0 download

Transcript of Laboratorio di Linguaggi lezione IX Marco Tarini Università dellInsubria Facoltà di Scienze...

Laboratorio di Linguaggi

lezione IX

Marco Tarini

Università dell’Insubria

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 ‧ 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

Espressioni e operatori

operatori su numeri- + * / %

>> << & |

== >= <= > <

|| && !

!=

==!=

-

+

operatori relazionali

operatori logici (booleani)

unari

bin

ari

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

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

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

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

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) + 10v[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 ‧ 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

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

Operatori unari di modifica

operatori su numeri- + * / %

>> << & |

== >= <= > <

|| && !

!=

==!=

-

+

operatori relazionali

operatori logici (booleani)

unari

bin

ari

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 ‧ 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

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 ‧ 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

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!

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

Assegnamenti

• Assegnamento base

=

<left value> = <expr>

tipo T0 tipo T1

expr di tipo T0

typecast automatico se T0 diverso da T1

(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 ‧ 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

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

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 ‧ 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

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" #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

Inclusione files

#include "bool.h"

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)

"inserisci unauna 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 ‧ 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

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

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

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 funzioneci deve essere!

variabili locali

• qui, due• visibili solo nel corpo della funzione.

• dichiarate all’inizio!

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 ‧ 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

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 ‧ 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

Definizioni e dichiarazioni

• Esempioint 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

Definizioni e dichiarazioni

• Esempio: invertiamo l'ordine per capriccioint 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 ‧ 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

Definizioni e dichiarazioni

• Esempioint 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 ‧ 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

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 ‧ 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

Struttura della compilazione

main.c

potenze.c

potenze.h

pre- process.

fileprecomp.

1 compiler

objectfile

main.o

pre- process.

fileprecomp.

3 compiler

objectfile

potenze.o

eseguibilefinale

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 ‧ 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

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

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

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

Con DevC++

Ripentendo per potenza.h si ottiene:nota: "compile" VS "build" (anche: "make")