Neste artigo
Switch case é a estrutura condicional que escolhe um caminho entre vários, comparando o valor de uma variável com uma lista de casos. Também é chamada de seleção múltipla.
No artigo anterior, você viu o if e o else, que fazem o programa escolher entre dois caminhos. E quando os caminhos são sete? Você conhece alguma pessoa indecisa, daquelas que criam condições para tudo? Antes de um encontro, ela fica assim:
- Será que eu vou?
- E SE a conversa não render?
- Ou SE eu chegar cedo demais?
- Ou SE o lugar estiver cheio?
São muitas condições, não acha? Quando o seu programa cair em uma situação com vários “SE” sobre a mesma coisa, existe um recurso feito para isso: o switch case.
Pense em um elevador. Você aperta o 3, e ele vai para o terceiro andar. Ele não fica perguntando “é maior que 2? é menor que 4?”. Vai direto para o andar que é igual ao botão.
Como funciona o switch case?
Imagine um programa que recebe um número de 1 a 7 e mostra o dia da semana. O switch trabalha assim:
- Pega o valor que está sendo testado.
- Compara esse valor com cada case.
- Executa os comandos do case que tem o valor igual.
- Ao encontrar o break, sai do switch.
- Se nenhum case for igual, executa o default, quando ele existe.

Ver a animação do switch procurando o caminho

Como usar o switch case em Python, PHP e C?
No PHP e no C, a estrutura se chama switch. No Python, ela se chama match, e o tutorial oficial a compara com o switch do C. No match, o caso escrito com um sublinhado (case _) serve para qualquer valor: é o default. E a barra vertical junta vários valores no mesmo caso.
Python:
# Switch case: escolher um caminho entre vários, pelo valor de uma variável
def nome_do_dia(dia):
match dia:
case 1:
return "domingo"
case 2:
return "segunda-feira"
case 3:
return "terça-feira"
case 4:
return "quarta-feira"
case 5:
return "quinta-feira"
case 6:
return "sexta-feira"
case 7:
return "sábado"
case _:
return "dia inválido"
def tipo_do_dia(dia):
# vários valores no mesmo caminho
match dia:
case 1 | 7:
return "fim de semana"
case 2 | 3 | 4 | 5 | 6:
return "dia útil"
case _:
return "dia inválido"
def mostrar_conta(a, operador, b):
match operador:
case "+":
print("%d + %d = %d" % (a, b, a + b))
case "-":
print("%d - %d = %d" % (a, b, a - b))
case "*":
print("%d * %d = %d" % (a, b, a * b))
case "/":
print("%d / %d = %d" % (a, b, a // b))
case _:
print("Operador %s: operação desconhecida" % operador)
def conceito(nota):
# faixas de valores pedem if e else if
if nota >= 90:
return "A"
elif nota >= 70:
return "B"
elif nota >= 50:
return "C"
else:
return "D"
for dia in [1, 3, 7, 9]:
print("Dia %d: %s" % (dia, nome_do_dia(dia)))
for dia in [1, 4, 9]:
print("Dia %d: %s" % (dia, tipo_do_dia(dia)))
for operador in ["+", "-", "*", "/", "?"]:
mostrar_conta(8, operador, 2)
for nota in [95, 72, 50, 30]:
print("Nota %d: conceito %s" % (nota, conceito(nota)))
PHP:
<?php
// Switch case: escolher um caminho entre vários, pelo valor de uma variável
function nome_do_dia(int $dia): string {
switch ($dia) {
case 1:
$nome = "domingo";
break;
case 2:
$nome = "segunda-feira";
break;
case 3:
$nome = "terça-feira";
break;
case 4:
$nome = "quarta-feira";
break;
case 5:
$nome = "quinta-feira";
break;
case 6:
$nome = "sexta-feira";
break;
case 7:
$nome = "sábado";
break;
default:
$nome = "dia inválido";
}
return $nome;
}
function tipo_do_dia(int $dia): string {
// vários valores no mesmo caminho
switch ($dia) {
case 1:
case 7:
$tipo = "fim de semana";
break;
case 2:
case 3:
case 4:
case 5:
case 6:
$tipo = "dia útil";
break;
default:
$tipo = "dia inválido";
}
return $tipo;
}
function mostrar_conta(int $a, string $operador, int $b): void {
switch ($operador) {
case "+":
printf("%d + %d = %d\n", $a, $b, $a + $b);
break;
case "-":
printf("%d - %d = %d\n", $a, $b, $a - $b);
break;
case "*":
printf("%d * %d = %d\n", $a, $b, $a * $b);
break;
case "/":
printf("%d / %d = %d\n", $a, $b, intdiv($a, $b));
break;
default:
printf("Operador %s: operação desconhecida\n", $operador);
}
}
function conceito(int $nota): string {
// faixas de valores pedem if e else if
if ($nota >= 90) {
return "A";
} elseif ($nota >= 70) {
return "B";
} elseif ($nota >= 50) {
return "C";
} else {
return "D";
}
}
foreach ([1, 3, 7, 9] as $dia) {
printf("Dia %d: %s\n", $dia, nome_do_dia($dia));
}
foreach ([1, 4, 9] as $dia) {
printf("Dia %d: %s\n", $dia, tipo_do_dia($dia));
}
foreach (["+", "-", "*", "/", "?"] as $operador) {
mostrar_conta(8, $operador, 2);
}
foreach ([95, 72, 50, 30] as $nota) {
printf("Nota %d: conceito %s\n", $nota, conceito($nota));
}
C:
/* Switch case: escolher um caminho entre vários, pelo valor de uma variável */
#include <stdio.h>
const char *nome_do_dia(int dia) {
const char *nome;
switch (dia) {
case 1:
nome = "domingo";
break;
case 2:
nome = "segunda-feira";
break;
case 3:
nome = "terça-feira";
break;
case 4:
nome = "quarta-feira";
break;
case 5:
nome = "quinta-feira";
break;
case 6:
nome = "sexta-feira";
break;
case 7:
nome = "sábado";
break;
default:
nome = "dia inválido";
}
return nome;
}
const char *tipo_do_dia(int dia) {
/* vários valores no mesmo caminho */
const char *tipo;
switch (dia) {
case 1:
case 7:
tipo = "fim de semana";
break;
case 2:
case 3:
case 4:
case 5:
case 6:
tipo = "dia útil";
break;
default:
tipo = "dia inválido";
}
return tipo;
}
void mostrar_conta(int a, char operador, int b) {
switch (operador) {
case '+':
printf("%d + %d = %d\n", a, b, a + b);
break;
case '-':
printf("%d - %d = %d\n", a, b, a - b);
break;
case '*':
printf("%d * %d = %d\n", a, b, a * b);
break;
case '/':
printf("%d / %d = %d\n", a, b, a / b);
break;
default:
printf("Operador %c: operação desconhecida\n", operador);
}
}
const char *conceito(int nota) {
/* faixas de valores pedem if e else if */
if (nota >= 90) {
return "A";
} else if (nota >= 70) {
return "B";
} else if (nota >= 50) {
return "C";
} else {
return "D";
}
}
int main(void) {
int dias[] = {1, 3, 7, 9};
for (int i = 0; i < 4; i++) {
printf("Dia %d: %s\n", dias[i], nome_do_dia(dias[i]));
}
int outros[] = {1, 4, 9};
for (int i = 0; i < 3; i++) {
printf("Dia %d: %s\n", outros[i], tipo_do_dia(outros[i]));
}
char operadores[] = {'+', '-', '*', '/', '?'};
for (int i = 0; i < 5; i++) {
mostrar_conta(8, operadores[i], 2);
}
int notas[] = {95, 72, 50, 30};
for (int i = 0; i < 4; i++) {
printf("Nota %d: conceito %s\n", notas[i], conceito(notas[i]));
}
return 0;
}
Saída:
Dia 1: domingo Dia 3: terça-feira Dia 7: sábado Dia 9: dia inválido Dia 1: fim de semana Dia 4: dia útil Dia 9: dia inválido 8 + 2 = 10 8 - 2 = 6 8 * 2 = 16 8 / 2 = 4 Operador ?: operação desconhecida Nota 95: conceito A Nota 72: conceito B Nota 50: conceito C Nota 30: conceito D
Foque no conceito, e não na linguagem! O programa tem quatro funções:
- nome_do_dia: um caminho para cada valor de 1 a 7. O 9 não tem case e cai no default: dia inválido.
- tipo_do_dia: vários valores no mesmo caminho. No PHP e no C, os cases ficam empilhados, sem comandos entre eles. No Python, a barra vertical faz o mesmo papel.
- mostrar_conta: o valor testado não precisa ser número. Aqui é o sinal da operação.
- conceito: essa não usa switch, e você já vai ver o motivo.
Quando escrevi a primeira versão deste artigo, o exemplo em Python usava if e elif. Hoje ele cabe no match.
O que acontece sem o break?
No C e no PHP, o break é o que encerra o caminho. Sem ele, a execução continua no case de baixo, mesmo que o valor seja outro. Testei aqui um switch com quatro cases que mostram “um”, “dois”, “três” e “quatro”, com o valor 2 e sem break nos dois primeiros:

O compilador GCC, com a opção -Wextra, até avisa do risco: “this statement may fall through”. Mas compila e roda.
No match do Python, isso não acontece: só o primeiro caso que combina é executado. Por isso o programa em Python não tem break nenhum.
Aí você pergunta: quando usar switch e quando usar else if?
Todo switch pode ser escrito como uma sequência de if e else if testando a mesma variável. A diferença está no tipo de teste. O switch compara um valor com constantes: é igual a 1? É igual a 2? Quando a pergunta é por faixa, como “a nota é maior ou igual a 90?”, o caminho é o if com else if. É o caso da função conceito do programa: 95 dá A, 72 dá B, 50 dá C e 30 dá D.
ATENÇÃO: no C, o switch só aceita valor inteiro ou caractere. Tentei usar um texto (“segunda”) e o GCC recusou com o erro “switch quantity not an integer”. No PHP e no match do Python, o texto funciona, como você viu na função mostrar_conta.
Quais são os erros mais comuns com o switch case?
- Esquecer o break no C e no PHP. A execução invade o case de baixo: “dois” e “três” em vez de só “dois”.
- Esquecer o default. Sem default e sem case igual, nada é executado, e o valor inesperado passa em silêncio.
- Tentar testar faixas nos cases. Cada case compara com um valor. Para “maior que” e “menor que”, use if e else if.
- Usar texto no switch do C. O GCC recusa: “switch quantity not an integer”.
- Esquecer que o switch do PHP compara de forma frouxa. No teste, o texto “2” combinou com o case do número 2. No match do Python, o mesmo teste não combinou.
Agora é com você!
No papel:
- Um switch em C tem os cases 1, 2, 3 e 4, que mostram “um”, “dois”, “três” e “quatro”. Só o case 3 tem break. O que aparece na tela quando o valor é 1? E quando é 4?
- Para cada problema, diga se combina mais com switch ou com else if: mostrar o nome do mês a partir do número; classificar uma idade em criança, adulto ou idoso; mostrar a ação de um semáforo a partir da cor.
No computador:
- Escreva uma função que recebe um número de 1 a 12 e devolve o nome do mês.
- Acrescente à função mostrar_conta o operador de resto da divisão.
- Faça um programa que recebe “verde”, “amarelo” ou “vermelho” e mostra o que o motorista deve fazer. No C, pense em como representar a cor.
Tente sozinho, sem pedir a resposta pronta para ninguém, nem para a IA!
No próximo artigo, o assunto são as comparações e os operadores lógicos, que montam as condições do if. Até lá!
Confiança Sempre!!!
Fontes:
- PHP, manual oficial, switch, com a equivalência com uma série de if sobre a mesma expressão, a comparação frouxa, a execução que continua nos cases seguintes sem o break, o default e os vários cases para o mesmo bloco.
- Python, documentação oficial, tutorial, match Statements, com o match comparado ao switch do C, o sublinhado como curinga, a barra vertical para juntar valores e a regra de que só o primeiro padrão que combina é executado (em inglês).
- IFPR, Câmpus Foz do Iguaçu, Lógica de Programação, Estrutura Condicional: switch-case, com a seleção múltipla, o break que causa a saída imediata do switch, o default e os cases agrupados (PDF, slides de aula).
- IFBA, Análise e Desenvolvimento de Sistemas, Estrutura de Seleção, com o switch similar ao if, else, if, a restrição de aceitar apenas constantes e o default opcional (slides de aula).
- Universidade Federal de Pernambuco, Centro de Informática, aula de Introdução à Programação sobre comandos condicionais, com a execução do case cujo rótulo é igual à expressão e as restrições do switch em C: expressão inteira ou caractere e rótulos constantes (PDF, slides de aula).
- PUCRS, Faculdade de Informática, Comando switch, com a seleção múltipla resolvida com if e else e a forma equivalente com switch (PDF, slides de aula).
- Universidade Federal do Vale do São Francisco, Introdução à Programação, aula 07, com a sintaxe da seleção múltipla switch/case, com break e default (PDF, slides de aula).
- Universidade Federal do Vale do São Francisco, Estruturas de Controle de Fluxo, aula 9, com o comando de seleção múltipla e os exemplos do nome do mês e do menu de operações (PDF, slides de aula).
- Unicamp, Instituto de Computação, MC102, aula 6, com o switch que decide o caminho dependendo exclusivamente do valor da variável (PDF, slides de aula).
- Universidade Federal do Rio Grande do Norte, DIMAp, DIM0321, Estruturas condicionais, com o switch como comando condicional que facilita a leitura quando há muitos casos (PDF).
- Os exemplos foram executados em Python 3.13, PHP 8.3 e GCC 13.

Continue a conversa