PORTATA (O
SCOPE O VISIBILITÀ)
si
dice portata o scope di un identificatore la porzione di codice nella
quale il legame tra esso e l'oggetto da esso identificato è
utilizzabile
es.
int
j = 7;
int
main(void){
int
n, k, h, i;
k
= h = 3;
for
(i = 1; i < k; i++){
char
j;
j
= 'a';
}
}
j è visibile
all'interno di main tranne nel for (poiché siamo all’interno
di un altro blocco ed è stata dichiarata una variabile locale)
esistono 4 tipi di
visibilità:
visibilità
nella funzione = le etichette sono le uniche ad averla
(infatti sono visibili in tutti i blocchi di codice presenti nella
funzione all’interno della quale sono state dichiarate)
visibilità
nel file = ce l’hanno gli identificatori dichiarati
all’esterno di qualsiasi funzione; tali identificatori saranno
noti in tutte le funzioni incluse fra il punto in cui sono stati
dichiarati e la fine del file
visibilità
nel blocco = hanno visibilità all’interno del
blocco le variabili che sono state dichiarate all’inizio di
una funzione, così come i suoi parametri, trattati nella
stessa maniera
visibilità
nel prototipo di funzione = le uniche ad averla sono le liste
di parametri incluse nel prototipo (basta solo il tipo, il nome
viene ignorato)
l’occultamento
delle informazioni all’interno di funzioni in modo da
nascondere i dettagli dell’implementazione di queste e detto
più formalmente incapsulamento delle informazioni
CLASSI DI MEMORIA
permanenza in
memoria = periodo durante il quale un certo identificatore esiste
in memoria (da non confondere con la visibilità)
SPECIFICHE DI CLASSE DI MEMORIA:
register =
prima della dichiarazione di una variabile automatica suggerisce al
compilatore di conservare la variabile in uno dei registri hardware
ad alta velocità del computer (però il compilatore può
ignorarle se i registri sono occupati, oppure decidere di sistemare
automaticamente le variabili più utilizzate nei registri)
extern =
permette di dichiarare degli identificatori che avranno un periodo
di permanenza in memoria pari all’intero programma (vengono
allocate all’inizio dell’esecuzione) e con visibilità
su tutto il codice (per utilizzare la variabile dovrò
redichiararla con l’attributo extern, nel blocco di codice
dove mi serve)
static =
permette di dichiarare degli identificatori che avranno un periodo
di permanenza in memoria pari all’intero programma (vengono
allocate all’inizio dell’esecuzione) e con visibilità
limitata al blocco in cui sono definiti
es.
#include
<stdio.h>
#include
<stdlib.h>
void
funct_1(void);
void
funct_2(void);
void
funct_3(void);
int
main(int argc, char *argv[])
{
int
j;
for
(j=0; j < 4; j++)
{
funct_1();
funct_2();
funct_3();
printf("\n");
}
return
0;
}
void
funct_1(void)
{
extern
int i; /* i viene definita piu' avanti */
printf("i(1)
= %2d\t", i++);
}
void
funct_2(void)
{
int
i; /* questa e' una variabile locale
* i
non e' visibile !!!
*/
printf("i(2)
= %2d\t", i++); /* il contenuto di i e' impredicibile:
*
area 'sporca' dello stack !!!
*/
}
void
funct_3(void)
{
extern
int i; /* i viene definita piu' avanti */
printf("i(3)
= %2d\t", i++);
}
int
i=0; /* variabile con classe di memoria extern
*/
AMBIENTE
l'ambiente
è una struttura dinamica che ci permette di descrivere
l'insieme dei nomi “validi” ad ogni istante della
computazione di una porzione di codice
es.
int
main(void){
i
= 5;
d
= 4;
d+=i;
}
l'espressione “e1,
e2” che valore ha? l'ultimo calcolato ?
e2
int
main(void){
int
x;
x
= 10;
{
int
y;
x
+=1;
}
{
double
x;
x
= 2.3;
}
}
l'ambiente
va consultato dal basso verso l'alto
gestisce
le variabili seguendo una regola LIFO = last in, first out
in
moduli diversi posso dichiarare variabili con lo stesso
identificatore e dello stesso tipo; nello stesso modulo
no, nemmeno se sono di tipi diversi
|