Linguaggio C Variabili e tipi di dato - diegm

Transcript

Linguaggio C Variabili e tipi di dato - diegm
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO
Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria
Università degli Studi di Udine
Linguaggio C
Variabili e tipi di dato
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
1
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Nota di Copyright
Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright
e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi
inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio,
musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide
Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca,
scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero
dell'Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di
lucro. In tal caso non è richiesta alcuna autorizzazione.
Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su
supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non
esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L'informazione contenuta in queste slide è ritenuta essere accurata alla data della
pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in
progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza
preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide
(ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità,
aggiornamento dell'informazione).
In ogni caso non può essere dichiarata conformità all'informazione contenuta in queste
slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono
mai essere rimossi e devono essere riportati anche in utilizzi parziali.
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
2
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Tipi di dato
• Le variabili e le costanti sono gli identificatori delle aree di
memoria dove andranno collocati i dati
• Il C è un linguaggio tipizzato, ovvero è necessario
specificare il tipo associato a ciascuna variabile e
costante
• Il tipo determina come esse vengano memorizzate e
manipolate dal programma
• Esistono due categorie di tipi di dato:
– tipi di dato predefiniti dal linguaggio, o fondamentali
→ interi e in virgola mobile
– tipi di dato definibili dall'utente, o derivati
→ tipi per enumerazione e tipi per composizione
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
3
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Nomi di variabili: sintassi
• I nomi delle variabili devono essere identificatori
validi
• Convenzioni:
– lettere minuscole per i nomi delle variabili
– caratteri tutti maiuscoli per i nomi delle costanti
(es. contatore vs. PI_GRECO)
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
4
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Tipi di dato interi
• tipo intero
• int : intero con segno rappresentato con almeno 2
byte
• short int (o short - forma sconsigliata): intero
con segno rappresentato con almeno 2 byte
• long int (o long - forma sconsigliata): intero con
segno rappresentato con almeno 4 byte
• long long int (o long long - forma
sconsigliata): intero con segno rappresentato con
almeno 4 byte (standard C99)
• tipo carattere
• char : è un singolo byte, in grado di rappresentare
un numero intero su 8 bit oppure uno qualsiasi dei
caratteri ASCII
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
5
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Relazione tra i tipi interi
sizeof (char) = 1
sizeof (short int) ≤ sizeof (int)
sizeof (int)
≤ sizeof (long int)
NOTA: la funziona sizeof restituisce la dimensione
in byte del tipo passato come argomento
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
6
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Tipi di dato interi e architetture
• Le moderne architetture dei calcolatori prevedono per
i tipi di dato interi un’allocazione della memoria
fortemente dipendente dall’hardware
• In una macchina con parallelismo a 16 bit (es. un PC
con DOS o Windows 3.1):
– int è un intero di 16 bit
– short int è un intero di 16 bit
– long int è un intero di 32 bit
• In una macchina con parallelismo a 32 bit (es. un PC
con Linux o Windows 9x/NT):
–
–
–
–
int è un intero di 32 bit
short int è un intero di 16 bit
long int è un intero di 32 (o talvolta di 64) bit
long long int è un intero di 64 bit
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
7
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Tipi di dato interi
• Esistono anche dei qualificatori applicabili ai tipi di dato
interi (char e int): essi sono signed e unsigned
– i tipi int sono implicitamente signed e rappresentano
i numeri in complemento a 2
– i tipi unsigned sono sempre positivi o nulli, e
rappresentano i numeri in binario puro
– una variabile di tipo char può avere o meno il segno,
ma in ogni caso i caratteri stampabili sono sempre
positivi
– per rappresentare correttamente il carattere End-Of-File
(EOF, ovvero il CTRL-Z o CTRL-D della tastiera) che
vale -1, talvolta si usa il tipo int anche per i caratteri
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
8
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Tipi di dato interi
Esempi di variabili di tipo intero:
int x;
long int fattoriale_di_x;
short int anno_nascita;
unsigned short int contatore;
Esempi di variabili di tipo carattere:
char carattere_letto;
unsigned char contatore;
→ è un contatore modulo 255
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
9
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Tipi di dato in virgola mobile
• In C sono disponibili tre tipi di dato in virgola mobile:
float : rappresentato su almeno 4 byte
double : rappresentato su 8 byte, con 11 bit per
l'esponente (doppia precisione)
long double : rappresentato su 10 o 12 byte, con 15
bit per l'esponente (quadrupla precisione)
• Il punto decimale (NON la virgola) separa la parte intera
da quella frazionaria; la lettera e (oppure E) separa la
mantissa dall'esponente
float x, y;
• Esempi:
double z;
x = 1.0;
y = 3.0e8;
z = 3.1415926535897932;
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
10
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Costanti
•
Le costanti intere possono essere specificate in decimale
(1234), ottale (01234, corrisponde a 12348) o esadecimale
(0xFF, per FFh)
– Una costante intera, come 1234, è un int
– Una costante intera seguita da una l (o L), come
123456789L, è una costante long int
– Una costante intera seguita da ll (o LL), come
123456789LL, è una costante long long int
– Una costante intera senza segno è terminata da una u
(oppure U), come 2345U o 0xABCDU
– I suffissi ul (o UL) indicano una costante unsigned long
int, come 123456789UL
– I suffissi ull (o ULL) indicano una costante unsigned
long long int, come 123456789ULL
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
11
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Costanti
• Le costanti floating-point contengono il punto
decimale, oppure un esponente, oppure entrambi
• Per default il loro tipo è sempre double
123.4
1e-5
6.22e23
• Il suffisso f (o F) indica una costante float, come
3.14F
• Il suffisso l (o L) indica una costante long double,
come 3.1415926535897932e2L
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
12
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Costanti
• Una costante carattere è un intero scritto sotto forma
di carattere racchiuso tra due apici, come '$'
• Il valore di tale costante è il valore numerico del
codice ASCII di quel carattere
Esempio: '0' ha valore 48 nel codice ASCII
• I caratteri di controllo, oppure quelli non ottenibili da
tastiera, si rappresentano con una sequenza di
escape che inizia con il backslash \
– Esempi: '\n' , ritorno a capo (CR, ASCII 0x0A)
'\0' , carattere nullo (ASCII 0x00)
'\\' , backslash (ASCII 0x5C)
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
13
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Costanti
• Si può generalizzare l'uso della sequenza di escape
per rappresentare qualsiasi carattere del codice
ASCII
• Ad esempio: '\061' (618), '\x31' (31h)
rappresentano entrambi il carattere stampabile '1'
• Le costanti carattere possono comparire nelle
espressioni numeriche e vengono trattate come interi
– Esempio: l'espressione: '3' - '0' vale 3.
Infatti:
codice ASCII di 3 - codice ASCII di 0
→ 0x33 - 0x30 = 0x03 = 310
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
14
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Stringhe costanti
• Una stringa costante, o costante alfanumerica, è una
sequenza di caratteri racchiusi fra doppi apici
• Esempi: "Questa è una stringa costante"
"" → è la stringa vuota!
• Gli apici non fanno parte della stringa, ma servono a
delimitarla
• Le stringhe costanti possono essere concatenate al
momento della compilazione:
"Hello," " world! "
equivale a: "Hello, world!"
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
15
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Stringhe costanti
• Nella rappresentazione interna, ogni stringa è
terminata dal carattere nullo '\0' (che vale 0)
• La memoria fisica (in byte) richiesta per ogni stringa è
pari al numero di caratteri fra gli apici più uno (il'\0')
• Esempio: la stringa costante "pippo" verrà
collocata in 5+1=6 byte di memoria
• NOTA: 'x' e "x" non sono la stessa cosa. Infatti,
'x' è un intero (ASCII 0x78), mentre "x" è una
stringa; in memoria essa è costituita dal carattere
'x' più il '\0'
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
16
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Tipi di dato per enumerazione
• Un’enumerazione è una lista di valori interi costanti
• Le costanti vengono fissate mediante una dichiarazione
di enumerazione, con la keyword enum:
enum giorno { Lunedi, Martedi, Mercoledi,
Giovedi, Venerdi, Sabato, Domenica };
• Per default, in un’enumerazione il primo nome ha
sempre valore 0, il secondo 1 e così via
• È anche possibile specificare dei valori espliciti, e tra
loro non necessariamente distinti:
enum mesi { GEN = 1; JAN = 1; FEB = 2; MAR = 3; APR =
4; MAG = 5; MAY = 5; GIU = 6; JUN = 6; LUG = 7; JUL
= 7; AGO = 8; AUG = 8; SET = 9; SEP = 9; OTT = 10;
OCT = 10; NOV = 11; DIC = 12; DEC = 12 } ;
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
17
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Dichiarazione delle variabili
• Per poterle utilizzare, tutte le variabili devono essere
dichiarate
• Una dichiarazione specifica il tipo e una lista di nomi
di una o più variabili di quel tipo:
int x, y, z;
unsigned char carattere_letto;
long double deficit_dello_stato;
• È anche possibile inizializzare una variabile ad un
valore contestualmente alla sua dichiarazione:
int i = 0;
char carattere_letto =
'a';
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
18
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Il qualificatore const
• Il qualificatore const si applica ad una variabile e
specifica che il suo valore non verrà mai alterato
const double e;
e = 2.71828182845905;
oppure
const double e = 2.71828182845905;
• Una costante può essere definita anche mediante
una macro di sostituzione, direttiva di preprocessor
all'inizio del file sorgente:
#define PIGRECO 3.1415926535897932
Tutte le occorrenze di PIGRECO nel codice saranno
automaticamente sostituite dalla costante
floating-point 3.1415926535897932
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
19
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Variabili locali
• Un programma C è costituito da un insieme di
funzioni
• Una variabile definita internamente a una funzione è
una variabile interna, o locale
#include <stdio.h>
int main()
{
int i = 4;
printf ("%d", i);
return;
}
i è una variabile locale
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
20
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Variabili globali
• È possibile definire anche delle variabili globali, o
esterne alle funzioni
• Esse sono accessibili a un insieme di funzioni
(oppure a tutte)
#include <stdio.h>
int a, b;
void f1(void);
int f2(void);
int main()
{
f1();
printf ("Somma a + b = %d",
f2());
return;
}
void f1(void)
{
printf ("Introduci a e b: ");
scanf ("%d %d", &a, &b);
return;
}
int f2(void)
{
return (a + b);
}
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
21
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Variabili globali e visibilità
• Le variabili globali sono un modo alternativo ai
parametri per comunicare informazioni tra funzioni
diverse
• Una variabile globale:
– va dichiarata all’inizio del file sorgente, subito
dopo le direttive al preprocessor
– è allocata in modo permanente per tutta la durata
del programma
– è visibile a tutte le funzioni dichiarate
successivamente nello stesso file sorgente
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
22
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Regole di visibilità (scope)
• Lo scope di un nome è la porzione di programma
all’interno della quale tale nome può essere usato
• Per una variabile locale, dichiarata all’inizio di una
funzione o come suo argomento, lo scope è la
funzione stessa
• Variabili locali aventi lo stesso nome ma dichiarate in
funzioni diverse sono variabili differenti!
• Per una variabile globale o una funzione, lo scope va
dal punto in cui essa è dichiarata fino al termine del
file in cui si trova
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
23
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Dichiarazione o definizione?
• È importante distinguere tra la dichiarazione di una
variabile esterna e la sua definizione
• Una dichiarazione rende note soltanto le proprietà di
una variabile
• Una definizione provoca anche l’allocazione di
un’area di memoria riservata a quella variabile
• La distinzione è fondamentale nel caso di variabili
esterne e utilizzate in più file sorgenti Ð la memoria
deve essere allocata una sola volta
• Gli stessi concetti verranno anche applicati alle
funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
24
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
Variabili extern
• Fra tutti i file che costituiscono il file sorgente, uno
solo deve contenere la definizione di una variabile
esterna
• Tutti gli altri possono contenere solo dichiarazioni
extern della stessa variabile
/* pippo.c */
/* pluto.c */
#include <stdio.h>
#include <stdio.h>
int x;
extern int x;
int main()
int main()
{
{
x = 5;
int y;
…
x = y + 4;
…
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
25
Fondamenti di Informatica - Linguaggio C - Variabili e tipi di dato
/* pippo.c */
L’allocazione della
memoria per la
variabile x viene
effettuata dalla
compilazione di
pippo.c
#include <stdio.h>
int x;
int main()
{
x = 5;
…
/* pluto.c */
#include <stdio.h>
extern int x;
In pluto.c, alla
variabile extern
corrisponde un
puntatore all’area di
memoria di x
int main()
{
int y;
x = y + 4;
…
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
26