Upload
palmira-murgia
View
220
Download
0
Embed Size (px)
Citation preview
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")