Publicidade

Aula 10: switch

A instrução switch — desvio por valor inteiro. case, break, default e fallthrough.

📖 O que aprender nesta página
✅ Essencial saber
  • Forma switch (x) { case 1: ... break; default: ...; }
  • Sempre break; ao fim de cada case
  • default roda quando nenhum case bate
⭐ Leia se tiver tempo
  • Fallthrough intencional (omitindo break)
  • Rótulos case precisam ser expressões constantes
  • switch só funciona com tipos inteiros (sem strings)
💡 else if agora está na Aula 8 (instrução if). Encadear else if é só uma extensão de if/else, então pertence a ela. Esta página foca em switch — uma construção diferente que despacha pelo valor de um inteiro.

Instrução switch — desvio por valor

Uma construção útil para despachar com base no valor de uma variável.
int day = 3;
switch (day) {
  case 1: printf("Segunda\n"); break;
  case 2: printf("Terca\n"); break;
  case 3: printf("Quarta\n"); break;
  default: printf("Desconhecido\n");
}
switch (expr)
O valor usado para desviar.
case valor:
Executa quando a expressão bate com este valor.
break;
Sai do switch (não esqueça).
default:
Roda quando nenhum case bate.
switch só funciona com tipos inteiros (int, char etc.). Você não pode dar switch em doubles ou strings.

Por que o break importa — fallthrough

Sem break;, a execução "cai" no próximo case e continua rodando — uma fonte clássica de bugs.
switch (n) {
  case 1: printf("A\n");   // sem break!
  case 2: printf("B\n");   // sem break!
  case 3: printf("C\n"); break;
}
// Quando n=1: imprime A, B e C!
🔴 O que realmente acontece quando você esquece break
Digamos que você queira imprimir o dia da semana para day 1–3, mas esqueceu todos os break:
int day = 1;
switch(day){
  case 1: printf("Seg\n");   // sem break
  case 2: printf("Ter\n");   // sem break
  case 3: printf("Qua\n");   // sem break
  default: printf("Desconhecido\n");
}
Saída (day=1):
Seg
Ter
Qua
Desconhecido

→ Depois de bater em case 1, a execução segue caindo em cases 2, 3 e default.
O mais assustador: nenhum erro de compilação. Você só percebe em tempo de execução, quando "tudo imprime".
🔴 E se você escrever case 1; em vez de case 1:?
Os dois-pontos : e o ponto e vírgula ; ficam lado a lado no teclado, então esse typo aparece o tempo todo.
switch(day){
  case 1; // ← digitou ; em vez de :
    printf("Seg\n");
    break;
}
Resultado: erro de compilação (gcc):
error: expected ':' or '...' before ';' token
→ O compilador espera um : depois de case 1 para completar o rótulo.
🔑 Macete: o : depois de case marca um rótulo (mesma sintaxe dos rótulos de goto). Instruções terminam com ;; rótulos terminam com :.
⚠️ Armadilha relacionada: default; em vez de default:
default também é um rótulo. default; pode compilar (como uma instrução vazia), mas vira um bug silencioso — o ramo "nenhum case bateu" nunca roda.
Fallthrough intencional: quando "1 ou 2 devem fazer a mesma coisa", você pode deixar o break de propósito. Coloque um comentário para os revisores saberem que é proposital:
case 1: case 2: printf("pequeno\n"); break; // intencional

Experimente — switch

switch.c
Saída
Clique em "Executar" para rodar...
💡 Experimente estas ideias também
Publicidade

Aulas Relacionadas

Condicionais
Aula 9: Instrução if
Como escrever instruções if em C. Visualize o desvio condicional com fluxogramas.
Laços
Aula 11: Laços for e while
Como usar laços for e while em C.
Referência
Cheat Sheet de C
Referência rápida de printf, operadores, tipos e mais.
← Aula anterior
Aula 14: Teste (if)
Próxima aula →
Aula 16: Laços (for/while)

Teste de Revisão

Teste seu entendimento desta aula!

Q1. O que acontece se você omitir o break numa instrução switch?

Erro de compilação
A execução cai no próximo case
Nada acontece

Sem break, a execução continua rodando em todos os cases que vêm depois do que foi encontrado. Isso se chama "fallthrough".

Q2. O default é obrigatório numa instrução switch?

Obrigatório
Opcional (pode ser omitido)
Obrigatório quando há três ou mais cases

default é opcional, mas geralmente vale incluir para ter um lugar para lidar com valores não correspondidos.

Q3. Qual tipo não pode ser usado na condição de um switch?

int
char
float

switch só aceita tipos inteiros (int, char etc.). float e double não são permitidos.

Compartilhe este artigo
Compartilhar no X (Twitter) Compartilhar no Facebook