Sei sulla pagina 1di 8

2

Variabili
 Porzioni di memoria RAM usate per
mantenere dati variabili nel tempo
Tipi di dati di base  La definizione di una variabile riserva una
porzione di memoria adeguata a contenere un
valore del tipo di dato indicato (intero,
floating-point, ecc.)
Ver. 2.4
 Definizione
tipoDato nomeVar [, nomeVar]... ;
 Esempi
int x;
float y, k, t;
© 2010 - Claudio Fornaro - Corso di programmazione in C

3 4

Variabili Variabili
 Tutte le definizioni delle variabili sono  I nomi delle variabili sono identificatori
collocate all’inizio del blocco, prima di tutte le composti da:
istruzioni eseguibili  Lettere
 Le variabili vengono create quando si entra  Cifre
nel blocco dove sono definite e vengono  Il carattere underscore ‘_’
eliminate quando si esce dal blocco stesso, si
dice che sono automatiche  Il primo carattere deve essere una lettera
 La visibilità (scope) di una variabile si  Non può contenere spazi
estende dal punto dove viene definita fino al  Minima lunghezza: 1 carattere
termine del blocco che la contiene (parentesi  Massima lunghezza: almeno 31
graffa di chiusura): scope locale
 Meglio non usare il carattere ‘_’ come primo
 Il termine dichiarazione in C ha un altro
carattere (tipicamente usato dal compilatore)
significato (e non alloca memoria)
5 6

Variabili Tipi di dati


 Lettere maiuscole e minuscole sono  Il tipo di una variabile indica quali valori
considerate diverse (Var e var sono variabili possono essere memorizzati in essa: intero,
diverse e indipendenti, non si definiscano floating-point, ecc.
variabili con nomi uguali salvo il case)
 I bit che costituiscono una variabile assumono
 Non si possono usare nomi riservati (le un significato in base al tipo di dato:
keyword del linguaggio) come int, main,
include, if, for, ...)  nei 32 bit di un intero in un complemento a due si
ha un’unica sequenza di bit che rappresenta un
 E’ utile usare nomi significativi del contenuto valore intero con segno
 Sono convenzionalmente scritte in minuscolo  nei 32 bit di un floating-point ci sono segno,
salvo eventualmente i primi caratteri di esponente e mantissa che rappresentano un valore
ciascuna parola (escluso il primo): frazionario in formato esponenziale
somma somma2 somma_2
sommaAlQuadrato somma_al_quadrato

7 8

Tipi interi di base Tipi interi di base


 char valore intero su un byte  Il tipo char è un normale tipo intero
 short int valore intero con segno, in composto da pochi bit (8), può dunque essere
genere ha meno bit di un int usato in ogni contesto ove basti un numero
 int valore intero con segno, è di intero piccolo (compatibile con i valori
solito pari alla word macchina rappresentabili con un char, cioè il range)
 long int valore intero con segno, in  Come il suo stesso nome indica, è un tipo
genere ha più bit di un int sicuramente in grado di contenere il codice
 Valori tipici: ASCII di un carattere
 short int: 16 bit  Dimensioni degli interi secondo lo standard:
 int: 32 bit  short: almeno 16 bit
 long int: 32 bit o 64 bit  int: almeno 16 bit e non meno di uno short
 int con short e long viene spesso omessa  long: almeno 32 bit e non meno di un int
9 10

Tipi interi di base Tipi interi di base


 Tutti i valori di tipo intero (char, int, short  Per i tipi int, short e long:
e long) possono essere memorizzati come il default è signed (e quindi non serve
numeri o con segno (tipicamente in specificarlo)
Complemento a 2) o senza segno (in binario  Per il tipo char:
puro, per avere un maggior range nei positivi) dipende dal compilatore se sono signed o
 Per specificare questo, nella definizione della unsigned, lo standard non indica alcun
variabile si può aggiungere una delle due default, richiede solo che i caratteri stampabili
keyword: signed o unsigned siano comunque memorizzati come valori
 Esempi positivi. Tipicamente sono signed ed è
unsigned short int z; inoltre possibile cambiare il default con
signed char x; opportuni settings del compilatore
unsigned long y;

11 12

Tipi interi: limiti del compilatore Costanti intere decimali


 L’header file <limits.h> definisce alcune  Sono sequenze di cifre decimali
costanti relative al range dei tipi interi eventualmente precedute da ‘+’ o ‘–’
(dipendono dal compilatore, tra parentesi i  Sono di tipo int se sono nel range degli int
valori tipici o i minimi richiesti dallo standard):  Sono di tipo long se escono dal range degli
 CHAR_BIT (in genere 8, numero di bit per char) int ma sono in quello dei long
 CHAR_MAX (in genere +127)  E’ un errore se escono dal range dei long
 CHAR_MIN (in genere –127)  Sono di tipo long se seguite dalla lettera L
 SHRT_MAX (almeno +32767)  Sono unsigned se seguite dalla lettera U
 SHRT_MIN (almeno –32767)
 123  int
 INT_MAX (almeno +32767) 123456  long int (es. se int su 16 bit)
 INT_MIN (almeno –32767) 123L  long int
 LONG_MAX (almeno +2147483647) 123U  unsigned int
 LONG_MIN (almeno –2147483647) 123UL  unsigned long int
13 14

Costanti intere ottali ed hex Tipi floating-point di base


 Una costante intera è considerata essere in  float valore in singola precisione
base 8 se è preceduta da uno 0:  double valore in doppia precisione
014  ATTENZIONE: vale 1210 (dodici!)
 long double valore in precisione multipla
 Una costante intera è considerata essere in
base 16 se è preceduta da 0x oppure da 0X  Valori tipici:
0X2C  vale 4410  float: 32 bit
 Le costanti ottali ed esadecimali possono  double: 64 bit
essere seguite da:  long double: 80 bit
 un carattere L o l per renderle long
 un carattere U o u per renderle unsigned
014ul  12 unsigned long int
0xbabau  47802 unsigned long int
0xblu  11 unsigned long int

15 16

Tipi floating-point di base Tipi f.p.: limiti del compilatore


 Lo standard richiede quanto segue:  L’header file <float.h> definisce alcune
 Il tipo double deve avere almeno lo stesso costanti relative alle dimensioni dei tipi di dati
numero di bit del tipo float floating-point (dipendono dal compilatore, tra
 Il tipo long double deve avere almeno lo stesso parentesi i minimi richiesti dallo standard):
numero di bit del tipo double  FLT_MAX (massimo numero di tipo float,
almeno 10+37)
 FLT_MIN (minimo, almeno 10–37)
 FLT_EPSILON (almeno 10–5, è il minimo valore
float x tale che 1.0 + x ≠ 1.0
(ossia non produce underflow)
 DBL_MAX (almeno 10+37)
 DBL_MIN (almeno 10–37)
 DBL_EPSILON (almeno 10–9)
17 18

Tipi f.p.: limiti tipici Costanti floating-point


 float (IEEE-P754)  Contengono un punto (non la virgola) decimale
 dimensioni: 32 bit e/o un esponente intero (positivo o negativo)
 range (circa): da ±1.4×10–45 a ± 3.4×10+38  L’esponente è preceduto da una e o E che ha il
significato di “per 10 elevato a ”: 4e5  4x105
 precisione: circa 7 cifre (in base 10)
(ad esempio –123.4567×10–12)  Sono di tipo double salvo indicazione diversa:
 valori interi consecutivi rappresentabili: [–224,+224]  12.0 12. .23 0.0 0. .0
21.2 12.3e5 12.3e+5 65e-5
 double (IEEE-P754)  Sono di tipo float se sono seguite da F o f
 dimensioni: 64 bit  21.2F 12.3e5F 43e-4F 43e4F
 range (circa): da ±4.9×10–324 a ±1.7×10+308  Sono di tipo long double se seguite da L o l
 precisione: circa 16 cifre (in base 10)  21.2L 12.3e5L 43e-4L 43e4L
(ad esempio –1234567.89012345×10+273)  12F (errore! manca il . e/o l’esponente con e)
 valori interi consecutivi rappresentabili: [–253,+253]  12L (è un long int, non un long double)

19 20

Scelta del tipo di dato Scelta del tipo di dato


 Si decide in termini di economia complessiva  Esempio
del programma, in base alle seguenti: Si vogliono memorizzare 2 milioni di valori
 I tipi interi sono elaborati molto più velocemente interi compresi tra 0 e 100. I valori sono
dei tipi floating-point compatibili (ossia nel range) di tutti i tipi di
 Più bit ci sono, più lento è il calcolo (in genere) dati visti, dai char (arrivano almeno fino a
 Più bit ci sono, maggiore è l’occupazione di 127) ai long double, ad esempio si
memoria complessiva considerino le due soluzioni seguenti:
 La conversione/promozione di un valore richiede  si usa il tipo char: si occupano 2 MB e i calcoli
tempo (si riveda dopo aver visto la parte sulle sono veloci
espressioni)  si usa il tipo double: si occupano 16 MB e i calcoli
 I valori char e short sono comunque sottoposti sono molto più lenti (senza alcun vantaggio
alle conversioni integrali (si riveda dopo aver visto rispetto al caso precedente)
la parte sulle espressioni)
21 22

Inizializzazione delle variabili Costanti numeriche


 La definizione di una variabile automatica non  Il modificatore const nella definizione delle
le assegna un valore iniziale (contenuto indef.) variabili informa il compilatore che queste non
 L’assegnazione esplicita del valore iniziale alle dovranno essere modificate
variabili contestualmente alla definizione è  Il valore della variabile const deve essere
detta inizializzazione specificato nell’inizializzazione, può anche
 I valori usati per inizializzare possono essere essere un’espressione di cui viene calcolato il
espressioni che utilizzano variabili già risultato al run-time (ossia in esecuzione)
inizializzate (si riveda dopo aver visto le parti const double Pi = 3.141592653;
sulle espressioni e sulle le funzioni matem.) const double Pi = 4.0*atan(1.0);
 const può essere messo prima o dopo il
 Esempi
nome di tipo a cui si riferisce.
int x = 12, y = 27*3*x; Le seguenti definizioni sono equivalenti:
double pigreco = 4.0*atan(1.0); const int x = 12;
(quest’ultimo è utile per avere un  preciso) int const x = 12;

23 24

Enumerazioni Enumerazioni
 Un’enumerazione serve per definire una lista di  Il nome dell’enumerazione (dettoTag) in
identificatori aventi valori costanti di tipo int genere viene omesso, a meno che non si
 Sintassi: vogliano definire successivamente variabili di
enum [nome] {cost1, cost2, ...}; questo tipo
 enum boolean {FALSE, TRUE}; enum {FALSE, TRUE};
definisce le due costanti:  Ciascun valore può essere inizializzato, i
 FALSE (con valore 0) successivi proseguono la numerazione
 TRUE (con valore 1) enum mesi {GEN=1, FEB, MAR, ecc.};
 I nomi delle costanti vengono in genere scritti enum lettere {A=1, B, C=9, D, ecc.};
in maiuscolo quindi qui B vale 2 e D vale 10
 Al primo identificatore viene assegnato il
valore 0, al secondo identificatore 1, e così via
25 26

Enumerazioni Enumerazioni
 I nomi delle costanti devono essere diversi da  I valori delle costanti possono ripetersi, anche
ogni altro identificatore presente nel modulo nella stessa numerazione
dove sono definiti enum a {A=1, B=1, C=2, D=2, ecc.};
 È un errore scrivere:  Si possono definire variabili di un tipo
enum unodue {UNO, DUE}; enumerativo, ma sono in realtà di tipo int e
enum unotre {UNO, TRE}; il compilatore non è tenuto a verificare se i
 Altro esempio di errore: valori assegnati alla variabile sono tra quelli
enum costanti {ALFA, BETA, GAMMA}; definiti nella definizione della enum:
int ALFA; enum boolean {FALSE, TRUE} pippo;
pippo = 12; non dà errore anche se
boolean contiene le sole
costanti 0 e 1

27 28

Costanti simboliche Costanti simboliche


 E’ possibile dare un nome (un identificatore)  Nell’esempio precedente, il preprocessore
ad una quantità costante, questo nome è cerca ogni occorrenza di DIM e la sostituisce
detto simbolo (per convenzione in maiuscolo) con 80 (i due caratteri 8 e 0), quindi una riga
 Prima della compilazione, il preprocessore di codice come la seguente:
cerca i simboli definiti con direttive #define: int vett[DIM];
#define nome sequenza_di_caratteri viene trasformata in:
e sostituisce ogni occorrenza del simbolo nome int vett[80];
con la corrispondente sequenza_di_caratteri prima della compilazione vera e propria
 Esempi  Si noti che identificatori come DIMENSIONE e
#define TRUE 1 ADIMENSIONATO non vengono modificati
#define FALSE 0
#define DIM 80  Le occorrenze trovate tra doppie virgolette non
#define INPUT_FILE "miofile.txt" vengono modificate "LA DIM DEL TEOREMA"
29 30

Costanti simboliche const, enum e define


 La sostituzione dei simboli inizia a partire  I valori enum e const vengono allocati
dalla riga dove è presente la #define e esattamente come le variabili, come tali
continua fino a fine file (ignorando la riservano memoria e sono utilizzati dal
struttura a blocchi del programma) debugger
 Non è un’istruzione C di assegnazione, ma  Le costanti simboliche delle define sono
una direttiva del preprocessore, quindi: sostituite dal preprocessore, quindi il
 non bisogna mettere il carattere ‘=’ tra il nome del compilatore non le vede come variabili, ma
simbolo e la sequenza_di_caratteri come semplici numeri costanti (no debug)
 non si deve mettere il ‘;’ al fondo  I valori delle enum sono solo di tipo int
 La sequenza_di_caratteri può contenere spazi e  I valori delle const e delle define possono
termina a fine riga essere di qualsiasi tipo

31

const, enum e define


 I valori delle enum sono automaticamente
inizializzati (utile quando si hanno molti valori)
 I valori delle const e delle define devono
essere indicati singolarmente
 La visibilità dei valori delle enum e delle
const è confinata alla funzione dove sono
definiti (come semplici variabili)
 La visibilità dei valori delle define inizia a
partire dalla riga dove è presente la #define
stessa e continua fino a fine file senza essere
confinata dalla struttura a blocchi del C