• Non ci sono risultati.

Tipi di dato

N/A
N/A
Protected

Academic year: 2021

Condividi "Tipi di dato"

Copied!
26
0
0

Testo completo

(1)

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

(2)

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.

(3)

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

(4)

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)

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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;

Tipi di dato interi

è un contatore modulo 255

(10)

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)

(11)

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

(12)

Costanti

• Le costanti floating-point contengono il punto

decimale, oppure un esponente, oppure entrambi

• Il punto decimale (NON la virgola) separa la parte intera da quella frazionaria; la lettera e (oppure E) separa la mantissa dall'esponente

• 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

(13)

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)

(14)

• 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 = 3

(15)

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

(16)

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'

(17)

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

(18)

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';

(19)

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

(20)

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>

#include <stdlib.h>

int main() {

int i = 4;

printf ("%d", i);

return EXIT_SUCCESS;

}

i è una variabile locale

(21)

Variabili globali

• È possibile definire anche delle variabili globali, o esterne alle funzioni

• Esse sono accessibili a un insieme di funzioni (oppure a tutte)

void f1(void) {

printf ("Introduci a e b: ");

scanf ("%d %d", &a, &b);

return;

}

int f2(void) {

return (a + b);

}

#include <stdio.h>

int a, b;

void f1(void);

int f2(void);

int main() {

f1();

printf ("Somma a + b = %d", f2());

return;

}

(22)

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

(23)

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

(24)

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

(25)

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 */

#include <stdio.h>

int x;

int main() {

x = 5;

/* pluto.c */

#include <stdio.h>

extern int x;

int main() {

int y;

x = y + 4;

(26)

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;

int main() {

int y;

x = y + 4;

In pluto.c, alla variabile extern corrisponde un

puntatore all’area di memoria di x

Riferimenti

Documenti correlati

La variabile di destinazione di un’assegnazione può avere tipo diverso dal tipo dell’espressione. int

 In C, la differenza tra carattere e numero è sfumata: il tipo di dati char char è un valore intero rappresentato con un byte, che può essere utilizzato per memorizzare sia

 Le parole chiave char char, int int, float float, double double, ed enum enum descrivono i tipi base; short short, long long, signed signed, unsigned unsigned sono i

© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright

I Ogni volta che si effettua una operazione di scrittura (attraverso putchar o printf) tutti i valori coinvolti vengono convertiti in sequenze di caratteri e quest’ultime vengo

aggiungiPrima: inserisci un oggetto prima della posizione corrente aggiungiDopo: inserisci un oggetto dopo la posizione corrente rimuoviCorrente: elimina dalla sequenza l’oggetto

Tipi riferimento Tipi di dato associati alla definizione di una classe; una variabile riferimento memorizza il riferimento ad un oggetto di una classe. Tipi primitivi Tipi di

• Linguaggi debolmente tipati: linguaggi nei quali i tipi possono essere ignorati, p.e...