Lab 7 - Escopo de variáveis
Em C possuímos três escopos distintos: global, local e parâmetros formais. O escopo define as regras de utilização das variáveis de um programa: onde elas são criadas e destruídas e como elas podem ser modificadas (escrita/leitura).
Variáveis globais
Existem durante toda a execução do programa e são acessíveis para todas as funções. Para uma variável ser global, basta ser declarada fora de qualquer bloco de função.
No exemplo a seguir iremos criar uma variável global g_counter
do tipo inteiro e a modificar em duas funções diferentes.
int g_counter;
void inc (void) {
g_counter++;
}
void dec (void) {
g_counter--;
}
Exercise 1
Answer
Para uma variável ser global ela deve ser declarada fora de funcão, mas atencão!! Você deve declarar a variável antes do seu uso, se não terá erro de compilacão. O exemplo a seguir não compilaria:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Info
Trabalhar com variáveis globais em C não é tarefa fácil e pode ser particularmente complicado quando o programa é separado em vários arquivos .c
e .h
. Nesses casos talvez você precise usar o keyword extern.
Warning
Evite usar variáveis globais! Elas são difíceis de gerenciar. O exemplo anterior pode ser reescrito para:
void inc (int *counter) {
(*counter)++;
}
void dec (int *counter) {
(*counter)--;
}
Variáveis locais
São as variáveis declaradas dentro das funções, e que são alocadas quando a função é chamada e a região de memória liberada quando a função retorna.
- As variáveis locais não podem ser modificadas por outras funções !!!
No exemplo a seguir iremos declarar duas variáveis locais, em duas funções distintas:
int foo (void) {
int var0 = 2;
return a;
}
int bar (void) {
int var1 = 3
return a;
}
Notem que:
var0
é apenas visível para a funçãofoo
var1
é apenas visível para a funçãobar
- As variáveis só são criadas quando a função é chamada.
Exercise 2
Answer
Nesses casos a variável local tem preferência e a saída do programa seria: 2
.
Exercise 3
Answer
Em C o main
é uma funcão como qualquer outra! Uma variável declarada dentro dela é visível apenas para a funcão main, a não ser que seja passada como referência como no exemplo anterior.
Mas a variável continua sendo local da funcão main.
Parâmetros formais
São tratados como variáveis locais e possuem precedência sobre as variáveis globais. Como demonstrado no exemplo a seguir:
int counter = 5;
int foo (int counter) {
return counter;
}
void main (void) {
int tmp = foo(2);
printf("%d", tmp);
}
A saída do programa é 2.
None 4 QA1
None 5 QA2
None 6 QA3
None 7 QA4
None 8 QA5