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