Laboratorio di Linguaggi lezione IX

28
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

description

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

Transcript of Laboratorio di Linguaggi lezione IX

Page 1: Laboratorio di Linguaggi lezione IX

Laboratorio di Linguaggi

lezione IX

Marco Tarini

Università dell’InsubriaFacoltà di Scienze Matematiche, Fisiche e Naturali di VareseCorso di Laurea in InformaticaAnno Accademico 2004/05

Page 2: Laboratorio di Linguaggi lezione IX

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)

unar

ibi

nari

Page 3: Laboratorio di Linguaggi lezione IX

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)) ) { ...}

Page 4: Laboratorio di Linguaggi lezione IX

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>

Page 5: Laboratorio di Linguaggi lezione IX

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?

Page 6: Laboratorio di Linguaggi lezione IX

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

Page 7: Laboratorio di Linguaggi lezione IX

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

&

Page 8: Laboratorio di Linguaggi lezione IX

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)

unar

ibi

nari

x+=3;

x>>=1;

x=x+3;

x = x >> 1;

-= += *= /= %=

>>= <<= &= |=

operatori di modifica(scorciatoie sintattiche)

Page 9: Laboratorio di Linguaggi lezione IX

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

Page 10: Laboratorio di Linguaggi lezione IX

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!

Page 11: Laboratorio di Linguaggi lezione IX

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;

Page 12: Laboratorio di Linguaggi lezione IX

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) { ... }}

Page 13: Laboratorio di Linguaggi lezione IX

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) { ... }}

Page 14: Laboratorio di Linguaggi lezione IX

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"

Page 15: Laboratorio di Linguaggi lezione IX

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

Page 16: Laboratorio di Linguaggi lezione IX

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

Page 17: Laboratorio di Linguaggi lezione IX

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

Page 18: Laboratorio di Linguaggi lezione IX

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”

Page 19: Laboratorio di Linguaggi lezione IX

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"

Page 20: Laboratorio di Linguaggi lezione IX

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); }

Page 21: Laboratorio di Linguaggi lezione IX

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"

Page 22: Laboratorio di Linguaggi lezione IX

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)

Page 23: Laboratorio di Linguaggi lezione IX

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"

Page 24: Laboratorio di Linguaggi lezione IX

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

Page 25: Laboratorio di Linguaggi lezione IX

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

Page 26: Laboratorio di Linguaggi lezione IX

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

Page 27: Laboratorio di Linguaggi lezione IX

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

Page 28: Laboratorio di Linguaggi lezione IX

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