2
respostas

duvida escopo da variável

podemos então declarar todas as variáveis no inicio, logo depois do main? ou cada variável tem q estar dentro do seu escopo menor?

2 respostas

Olá Viviane,

Te digo que depende da necessidade.

Sim, é bom, nós declararmos todas as variáveis centralizadas em um único local, dentro do "main" por exemplo.

Somente, em escopos que, nossas funções, possam ser executadas fora do main, será necessário declarar variáveis lá dentro.

um exemplo:

main(){
variável 01;
}

funcaoteste(){
variável 01;
}

Dentro de funcaoteste, ele não conseguirá enxergar as declarações que estão dentro do método main, então, será necessário declarar as variáveis.

O escopo define a visibilidade e o tempo de vida de uma variável. De forma geral, quanto mais limitado o escopo, mais fácil o entendimento sobre como o programa altera determinada variável, o que auxilia no processo de compreensão e depuração do programa. Quando um mesmo nome é sobreposto em um escopo mais interno, prevalece o escopo menor. Por exemplo, execute o programa abaixo:

int main(int argc, char *argv[]) {
    // escopo local da função main
    int x = 5;
    printf("%d\n", x); // irá imprimir 5

    {
        // escopo local de um bloco interno da função main
        int x = 10;

        printf("%d\n", x);  // irá imprimir 10
    }

    printf("%d\n", x);  // irá imprimir 5

    return 0;
}

Você pode declarar variáveis em qualquer ponto do código.

#include <stdio.h>

int x = 100;

int funcao() {
    static int x = 0;
    return x++;
}

void global() {
    printf("global: %d\n", x);
}

int main(int argc, char *argv[]) {
    int x = 10;

    for (int i = 0; i < 5; i++) 
        printf("funcao: %d\n", funcao());

    {
        int x = 1000;

        printf("bloco interno: %d\n", x);
    }

    printf("main: %d\n", x);

    global();

    return 0;
}

O modificador de acesso static quando usado em uma variável global faz com que a mesma seja visível apenas no arquivo em que foi declarada, caso seja usado em uma variável dentro de uma função, faz com que o estado da mesma seja preservado mesmo após o retorno da função. Quando for escrever código multi-threaded, cuidado com variáveis estáticas e variáveis globais!

Uma boa prática é declarar variáveis o mais próximo possível de seu uso e garantir o mínimo privilégio, ou seja, limitar variáveis de escopo global e localizar ao máximo o escopo, ocultar módulos e funções privadas, sempre que possível usar constantes (macros ou variáveis marcadas com const*) no lugar de variáveis mutáveis. Use nomes não ambíguos e que descrevam bem a intenção. Escreva funções com poucos parâmetros, que façam uma única tarefa de forma a segmentar o programa em funções pequenas que possam ser reutilizadas.

const*: variáveis marcadas com este modificador não são verdadeiramente constantes, por meio de acessos de baixo nível é possível alterar o valor, por este motivo não podem ser usadas quando se espera um escopo estático, como por exemplo na definição do tamanho de arrays.