Pra Que Usar break no switch?

por Fabio A. Mazzarino

Apesar de não ser único das linguagens C e C++, a forma que a estrutura de controle de fluxo switch funciona é um pouco diferente de quando aprendemos algorítmos, ou quando aprendemos linguagens mais simples. Este post vai explicar como exatamente funciona o switch, e por que é necessário utilizar o break no switch? Será que é?

Sintaxe Básica

Primeiro a síntaxe básica do switch:

switch (expr) {
    case const-expr: statement
    ...
    default: statement
}

Note que não existe nada diretamente relacionado com o break. Isso mesmo, break não é necessário nem obrigatório. Porém para facilitar o ensino, muitos cursos apontam a necessidade do break, normalmente porque boa parte de quem aprende C está vindo de outra linguagem.

Exemplos

O break é utilizado no switch, tal qual em outras estruturas de loop, para interromper o fluxo de execução, encaminhando-o para fora da estrutura. O código abaixo ilustra como funciona um switch sem break:

#include <stdio.h>
int main() {
    char c = 'b';
    switch (c) {
        case 'a': 
            printf("a\n");
        case 'b': 
            printf("a or b\n");
        case 'c': 
            printf("a or b or c\n");
    }
}

O resultado será:

a or b
a or b or c

Ou seja, o switch irá executar do case ‘b’ em diante, mesmo que isso implique em executar o código que está abaixo do case ‘c’.

Normalmente utiliza-se break para evitar a execução do código abaixo do case ‘c’. Mas nem sempre é o desejado. O código abaixo ilustra esta situação:

#include <stdio.h>
int main() {
    printf("*** MENU PRINCIPAL ***\n");
    printf("A. Adicionar novo item\n");
    printf("B. Pesquisar itens\n");
    printf("C. Consultar item\n");
    printf("D. Apagar itens\n");
    printf("Digite opcao: ");
    char opt = getchar();
    switch (opt) {
        case 'a':
        case 'A': 
            printf("\nAdicionando novo item\n\n");
            break;
        case 'b':
        case 'B':
            printf("\nPesquisando itens\n\n");
            break;
        case 'c':
        case 'C':
            printf("\nConsultando item\n\n");
            break;
        case 'd': 
        case 'D':
            printf("\nApagando item\n\n");
            break;
        default: 
            printf("\nOpcao invalida!\n\n");
    }
}

O código exibe um menu, e aceita tanto caracteres maiúsculos como minúsculos. Note o break a cada dois cases, para evitar que a escolha de um comando execute as funções referentes a outros comandos. Note também que a última opção, default, não necessita de break.

Em Resumo

Apesar de muita gente aprender que o break é obrigatório, na linguagem C não é. E a construção do exemplo acima é praticamente unânime em times de desenvolvimento.

Portanto, para dar manutenção em código C profissionalmente, e para gerar código C mais limpo e de fácil manutenção, conhecer o real funcionamento do switch é essencial.