Médio C
Escopo de bloco e sombreamento
Enunciado
Escreva um programa que declare uma variável int x = 1; no main. Em seguida, crie um bloco { ... } que declare outra variável int x = 2; e imprima seu valor. Depois do bloco, imprima o valor de x novamente. Explique o que acontece com o escopo.
Requisitos
- O programa deve compilar sem erros.
- Dentro do bloco, imprimir
x interno: 2. - Fora do bloco, imprimir
x externo: 1. - Usar chaves para criar o escopo interno.
Código inicial
#include <stdio.h>
int main(void) {
int x = 1;
// crie o bloco e imprima
return 0;
}
Saída esperada
x interno: 2
x externo: 1
Ver dica
Dentro do bloco, declare int x = 2;. A variável interna sombreia a externa apenas dentro das chaves.
Mostrar solução
#include <stdio.h>
int main(void) {
int x = 1; // variável do escopo do main
{
int x = 2; // nova variável, sombreia a externa
printf("x interno: %d\n", x);
}
printf("x externo: %d\n", x); // volta a ver a variável do main
return 0;
}
Passo a passo
int x = 1;cria uma variável no escopo domain.- Abrimos um bloco
{que define um novo escopo. - Dentro do bloco,
int x = 2;cria uma nova variávelx, independente da anterior. Isso é chamado de sombreamento (shadowing). - O
printfdentro do bloco acessa a variável interna, imprimindo 2. - Ao fechar o bloco
}, a variável interna é destruída. - O
printffora do bloco acessa a variável original domain, imprimindo 1.
Por que funciona
O escopo é determinado pelas chaves {}. Cada bloco pode declarar variáveis com o mesmo nome; a mais interna tem precedência enquanto o bloco estiver ativo. Isso é útil para limitar o tempo de vida de variáveis auxiliares.
Erros comuns
- Esquecer as chaves: sem
{}, a segunda declaraçãoint x = 2;no mesmo escopo causa erro de compilação (redeclaração). - Usar a variável interna fora do bloco: erro de compilação, pois ela não existe mais.
- Confundir sombreamento com atribuição:
x = 2;(semint) alteraria a variável externa, não criaria uma nova.
Outra forma de resolver
Usar nomes diferentes, como x_interno e x_externo, evitando sombreamento. É preferível quando o código precisa ser mais legível e evitar confusão.
Saída esperada
x interno: 2
x externo: 1