• Mutirão

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

void display() {

    printf("%d\n", glo);
}

int main() {

    display();
    glo = 10;
    display();
}

Em qual linha do código anterior você deve declarar a variável glo para que ela seja global?

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
/* --- Exemplo incorreto --- */
#include <stdio.h>

void display() {
    /* glo é utilizado antes de ser declarado */
    printf("%d\n", glo);
}

/* --- ERRADO! --- */
int glo = 10;

int main() {

    display();
    glo = 10;
    display();
}

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ção foo
  • var1 é apenas visível para a função bar
  • As variáveis só são criadas quando a função é chamada.

Exercise 2

Qual saída esperada do programa a seguir?

int counter = 5;

void foo (void) {
    int counter = 2;
    printf("%d", counter);
}

void main (void) {
    foo();
}

Answer

Nesses casos a variável local tem preferência e a saída do programa seria: 2.

Exercise 3

void get_temp (int *temp) {
    _arduino_get_temp(temp);
}

void main (void) {
    int *temp;
    get_temp(temp)
}

A variável temp do código anterior é:

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.