por xultz » 11 Dez 2016 21:48
Vonnilmann, uma vantagem enorme de se utilizar variáveis locais é poder usar variáveis de mesmo nome em funções diferentes, e uma não interferir na outra.
Por exemplo, eu crio um função A e dentro dela declaro uma variável x. Depois crio uma função B e dentro eu também declaro uma variável x. Um x não tem nada a ver com o outro x.
A programação estruturada, que é o caso da linguagem C, tem essa premissa: você cria blocos de código que executam uma tarefa específica (que é uma função), que (opcionalmente) recebem variáveis de parâmetros, e (opcionalmente) retorna uma variável de resultado.
Dessa forma, para um código que está fora de uma função, tudo que está ali dentro é uma caixa-preta: o código dentro da função e suas variáveis são completamente desconhecidas, o código só sabe que passa alguns parâmetros e recebe um retorno. Então se eu tiver dezenas de funções e todas tiverem variáveis com mesmo nome, não vai dar nenhum problema, porque o código e as variáveis ficam ali enclausuradas. Isso possibilita, por exemplo, que várias pessoas trabalhem num mesmo código, com pouca interação entre elas. Suponha o seguinte, você está fazendo um programa, e precisa calcular as raízes de uma função de segundo grau utilizando a famosa fórmula de Bhaskara. Mas você decide passar esta tarefa para outra pessoa. Aí você chega pro colega e diz "cara, programa aí uma função que calcula as raízes com o Bhaskara. Eu vou passar três variáveis float que representam, na ordem, os valores A, B e C da equação de segundo grau, e me retorne como um float a raíz positiva. Depois faça uma função que retorne a raiz negativa. Chame a primeira função de raiz_positiva e a segunda de raiz_negativa". Isso que você especificou é um protótipo e podemos chamar de
float raiz_positiva(float, float, float);
float raiz_negativa(float, float, float);
Depois que teu colega terminar este trabalho hercúleo, você não precisa se preocupar com os nomes de variáveis que ele está usando para fazer esse trabalho, porque prá você, o código dentro da função pode ser uma caixa-preta. Se funciona, você nem precisa olhar como ela funciona.
Imagine o pior caso possível, que é o kernel Linux. O Linux, que é feito em C, tem muitas milhões de linhas de código (é sério), e muitas milhares de funções. E zilhões de variáveis prá fazer tudo quanto é tipo de trabalho. Consegue imaginar o serviço de corno que seria ter que gerenciar todas as variáveis, garantir que nunca tenham o mesmo nome, se fossem todas globais?
Então assim: usar variáveis locais é uma boa prática programação. Usar variáveis globais não é pecado, não é errado, mas devem ser utilizadas somente quando realmente forem necessárias, que é o caso de um valor que deve ser acessado por duas funções diferentes. O caso mais comum de se usar variáveis globais é dentro de ISR (que são as rotinas de tratamento de interrupção). Uma ISR é uma função que não recebe parâmetros e não retorna nada, porque ela é executada quando uma interrupção ocorre, não porque alguém solicitou. Assim, é bem comum, por exemplo, escrever uma ISR que trate o recebimento de um caracter pela porta serial. E por meio de uma variável global, informar à main que chegou um caracter, e por meio de outra global, armazenar este caracter.
Me fiz entender?
98% das vezes estou certo, e não estou nem aí pros outros 3%.