Programação

Switch case: o que é e como usar

Atualizado em

Capa do artigo Switch case: o que é e como usar
Leitura com foco

Entenda o contexto.
Leve para a prática.

Neste artigo
  1. Como funciona o switch case?
  2. Como usar o switch case em Python, PHP e C?
  3. O que acontece sem o break?
  4. Aí você pergunta: quando usar switch e quando usar else if?
  5. Quais são os erros mais comuns com o switch case?
  6. Agora é com você!

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.
O valor dia igual a 3 aponta para o case 3, que mostra terça-feira e termina com break; os outros cases e o default ficam de fora
Com o valor 3, só o caminho do case 3 é executado. O break encerra o switch.
Ver a animação do switch procurando o caminho
Animação do switch comparando o valor 3 com cada case até achar o igual e, depois, o valor 9 caindo no default
Com o valor 3, o switch chega ao case 3, executa e sai. Com o valor 9, nenhum case é igual e vale o default.

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:

Comparação do switch com break em todos os cases, com saída dois, e sem break nos cases 1 e 2, com saída dois e três
No teste em C e em PHP, a saída sem o break foi “dois” e “três”: a execução só parou no break do case 3.

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:

Sobre quem escreve

Walmir Silva

Olá! Sou Walmir, engenheiro de software com MBA em Engenharia de Software e o cérebro por trás do GrowthCode e autor do livro "Além do Código".

Se você acha que programação é apenas sobre escrever código, prepare-se para expandir seus horizontes. Aqui, nós vamos além do código e exploramos as interseções fascinantes entre tecnologia, negócios, artes e filosofia.

Você está em busca de crescimento na carreira? Quer se destacar em um mercado competitivo? Almeja uma vida mais rica em conhecimento e realização? Então você chegou ao lugar certo. No GrowthCode, oferecemos insights profundos, estratégias comprovadas e um toque de sabedoria filosófica para catalisar seu crescimento pessoal e profissional.

Ver todos os artigos →

Continue a conversa

Compartilhe sua perspectiva

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Encontre sua próxima resposta

O que você quer aprender?

Preferências de cookies

Os cookies opcionais começam desligados. Você pode mudar a escolha a qualquer momento por esta tela.

NecessáriosSempre ativos

Guardam a sua escolha de cookies e mantêm o site funcionando. Não são usados para publicidade.

Contam visitas e mostram como o site é usado: Google Analytics e Microsoft Clarity, carregados pelo Google Tag Manager. Como esse contêiner também carrega tags de publicidade, as estatísticas só são ativadas junto com Publicidade e marketing.

Exibem anúncios do Google AdSense e medem campanhas e e-mails: pixels da Meta e do TikTok e o Mautic.

Permite que o Google escolha anúncios com base nos seus interesses. Desligado, os anúncios aparecem sem personalização. Depende de Publicidade e marketing.

Também é possível bloquear cookies nas configurações do navegador. Detalhes na Política de privacidade.