Variabili e Tipi 🇬🇧
Note a cura di Antonino Furnari - antonino.furnari@unict.it🔝
Università di Catania, Dipartimento di Matematica e Informatica
Note disponibili qui: http://www.antoninofurnari.github.iohttps://antoninofurnari.github.io/lecture-notes/it/programmazione-c/variabili-e-tipi/
In termini astratti, possiamo vedere una variabile come un contenitore all’interno del quale possiamo inserire dei dati. In termini più tecnici, le variabili sono dei riferimenti simbolici a delle aree fisiche della memoria del computer che possono contenere dei dati. Ad esempio, il seguente pseudo-codice mostra come usare due variabili per calcolarne la somma (attenzione, quello che segue non è codice C valido!):
|
|
Nelle sezioni seguenti vedremo come utilizzare le variabili in C.
Nomi delle variabili
Un nome valido di variabile contiene lettere numeri e underscore. Altri simboli o spazio non possono essere inclusi nei nomi di variabili. I normi delle variabili devono obbligatoriamente iniziare con una lettera o un underscore. Esempi di nomi validi sono:
var_123
;_var2
;_23_var
.
Esempi di nomi non validi sono:
2var
;2_var
;var-2
.
I nomi delle variabili inoltre non possono essere uguali a delle parole chiave che sono “riservate” in C++. Queste sono:
auto
double
int
struct
break
else
long
switch
case
enum
register
typedef
char
extern
return
union
continue
for
signed
void
do
if
static
while
default
goto
sizeof
volatile
const
float
short
unsigned
Va inoltre notato che C è un linguaggio case sensitive, il che significa che una lettera maiuscola e una minuscola vengono considerate come diverse. Per cui i simboli var
e Var
sono di fatto considerati simboli diversi (es nomi di varibaili diversi).
Domanda Quali dei seguenti sono nomi validi di variabili?
|
Quando il nome di una variabile è composto da più parole, è comune seprare le diverse parole con un underscore:
|
|
Questo schema è noto come snake case. Alternativamente, è possibile usare il camel case, che non separa le parole, ma rende maiuscola la prima lettera di ciascuna parola:
|
|
Tipi di variabili
Qualsiasi variabile in C è associata a un tipo, che specifica la natura dei dati che essa può contenere. Ciò è necessario perché, a seconda del tipo, sarà necessaria una diversa quantità di memoria per memorizzare il dato associato alla variabile e perché dati di viersi tipi vengono rappresentati in maniera diversa in memoria. Dato che C è più uno standard che un linguaggio implementato in maniera uniforme in diverse piattaforme, in generale i tipi non hanno una dimensione ben specifica.
I tipi fondamentali del C sono:
char
: codificano caratteri qualic
,;
o%
;int
: rappresentano numeri interi quali 2 o -777, che possono essere sia con segno (e dunque positivi e negativi) che senza segno;float
: numeri con la virgola a singola precisione, quali 2.2 o -7.8;double
: numeri con la virgola a doppia precisione (si possono rappresentare più cifre dopo la virgola).
É possibile inoltre applicare i modificatori unsigned
, short
e long
ad alcuni tipi sopra per modificare alcune proprietà della rappresentazione dei tipo fondamentali. In particolare:
unsigned
viene usato per rappresentare numeri senza segno. Può essere applicato achar
eint
. Ad esempiounsigned int
permette di rappresentare interi positivi (senza senzo). Dato che viene risparmiato il bit necessario alla memorizzazione del segno, i tipi unsigned permettono di rappresentare un numero più elevato di valori delle rispettive parti con segno. Esiste anche il modificatoresigned
, che viene però applicato di default (signed int
eint
sono la stessa cosa). Va inoltre notato che è possible abbreviareunsigned int
inunsigned
;short
viene usato conint
per indicare un tipo di intero che occupa meno spazio in memoria e che quindi può rappresentare meno numeri. Il tiposhort int
è utile quando si sa che la variabile usata rappresenterà numeri piccoli. Il tiposhort int
può essere abbreviato inshort
;long
viene usato conint
per indicare un tipo di intero che occupa più spazio in memoria e che quindi può rappresentare più numeri. Il tipolong int
è utile quando si sa che una variabile usata prappresenterà numeri molto grandi. Il tipolong int
può essere abbreviato inlong
.
I modificatori unsigned
e short
o long
possono essere combinati. Ad esempio unsigned short int
o unsigned short
indica un intero piccolo senza segno.
Il numero di byte necessario per rappresentare ciascun tipo varia da compilatore a compilatore. Lo standard stabilisce solo alcune direttive (ad esempio il tipo long int
deve usare almeno tanti byte quanto int
). Il char
occupa generalmente un byte (8 bit), mentre int
occupa generalemtne 4 bytes, così come float
. double
e long int
occupano generalmente 8 byte, mentre long double
occupa generalmente 16 byte.
Formati di stampa
Prima di procedere, dobbiamo fare una piccola parentesi sui formati di stampa che si possono utilizzare mediante printf
. Finora abbiamo visto il formato %d
che ci permette di stampare un intero. Ogni tipo richiede però il suo specificatore di formato in printf
. I principali sono:
%c
: caratteri;%d
: interi;%f
: numeri in virgola mobile;%e
: numeri in notazione scientifica (es. 2e-5);%u
: unsigned int;%li
: long int;%lu
: unsigned long int;%Le
: long double in notazione scientifica;%s
: stringhe.
Torneremo a parlare in termini più accurati formati di stampa nelle prossime lezioni.
Possiamo visualizzare le dimensioni in byte e i limiti di ciascun tipo mediante il seguente programma:
|
|
TYPE SIZE MIN MAX
----------------------------------------------------------------------------
char 1 -128 127
unsigned char 1 0 255
----------------------------------------------------------------------------
short int 2 -32768 32767
unsigned short int 2 0 65535
int 4 -2147483648 2147483647
unsigned int 4 0 4294967295
long int 8 -9223372036854775808 9223372036854775807
unsigned long int 8 0 18446744073709551615
----------------------------------------------------------------------------
float 4 1.175494e-38 3.402823e+38
double 8 2.225074e-308 1.797693e+308
long double 16 3.362103e-4932 1.189731e+4932
----------------------------------------------------------------------------
Si noti che nel programma sopra abbiamo importato gli header limits.h
e float.h
che mettono a disposizioni le costanti quali INT_MIN
e DBL_MAX
che contengono i limiti dei tipi numerici.
Il tipo booleano
Molti linguaggi di programmazione mettono a disposizione il tipo booleano, che permette di rappresentare solo due valori (true e false). Dallo standard C99 in poi, viene messo a disposizione il tipo _Bool
per assolvere a questo compito. Una variabile di tipo _Bool
può contenere solo due valori 0
e 1
, che vengono assimilati ai valori true
e false
. Vediamo qualche esempio:
|
|
0
1
1
1
true
Il C mette a disposizione anche una libreria `stdbool` che definisce le macro `bool`, `true` e `false` che semplificano il codice quando si lavora con le variabili booleane:
|
|
true
Va notato che la dimensione di un `bool` è comunque di un byte (come char), anche se di fatto è necessario solo un bit per rappresentare i valori booleani:
|
|
Size of bool: 1 byte
Domanda Qual è il tipo più adeguato per i seguenti valori?
|
Dichiarazione
Qualsiasi variabile in C è associata a un tipo, che ne specifica la natura. Quando dichiariamo una variabile, dobbiamo dichiararne sempre il tipo. Dichiarare una variabile serve a chiedere al compilatore di riservare in memoria lo spazio necessario per la variabile. Dichiarare una variabile in C è molto semplice. Basta scrivere il tipo seguito dal nome della variabile. Esempi di dichiarazione di variabili sono:
|
|
E’ possibile dichiarare più di una variabile dello stesso tipo alla volta facendole seguire da delle virgole nella stessa dichiarazione:
|
|
Che è del tutto equivalente a:
|
|
Inizializzazione
Una volta inizializzata una variabile, è possibile assegnare dei valori alle variabili mediante l’operatore di assegnamento =
. Ad esempio:
|
|
9
Il primo assegnamento che effettuiamo con una variabile viene detto "inizializzazione". Esempio:
|
|
Una volta dichiarata una variabile, essa contiene un valore indeterminato finché non viene inizializzata mediante l’operatore di assegnamento =
. Dato che è buona norma inizializzare sempre le variabili, il linguaggio C permette di inizializzarle contestualmente alla loro definizione. Ad esempio:
|
|
x+y=3.20
Conversione di tipo implicita
C converte i tipi implicitamente all’occorrenza. Vediamo qualche esempio:
|
|
2
12.00
1
Esercizi
Esercizio Si scriva un programma che verifichi i limiti numerici del tipo |
Esercizio Si dichiari una variabile con un tipo opportuno per contenere il numero |