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

  1. int x = 1; cria uma variável no escopo do main.
  2. Abrimos um bloco { que define um novo escopo.
  3. Dentro do bloco, int x = 2; cria uma nova variável x, independente da anterior. Isso é chamado de sombreamento (shadowing).
  4. O printf dentro do bloco acessa a variável interna, imprimindo 2.
  5. Ao fechar o bloco }, a variável interna é destruída.
  6. O printf fora do bloco acessa a variável original do main, 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ção int 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; (sem int) 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