8 Execução condicional com switch
A linguagem C provê, além do if
, uma segunda estrutura para execução condicional: o switch
.
8.1 Entendendo o switch
O switch
é uma estrutura da linguagem usada para estabelecer uma sequência de instruções.
A expressão é qualquer expressão que resulte em um valor escalar, como int
, char
ou mesmo bool
. Por sua vez, comando é um bloco delimitado com chaves com uma lista de comandos que serão executados condicionalmente.
O trecho de código seguinte ilustra a estrutura do switch
com vários chamadas para a função printf
. A variável valor
pode ser um int
, por exemplo.
switch(valor) {
("A\n");
printf("B\n");
printf("C\n");
printf("D\n");
printf("E\n");
printf("F\n");
printf("G\n");
printf("H\n");
printf("I\n");
printf}
Esse código, do jeito que está apresentado, não terá nenhum de seus comandos executados. A especificação para que algo seja executado é feito por rótulos que indicam em que posição da sequência se inicia a execução.
Os rótulos são especificados com case
.
Segue a lista de comandos com rótulos inseridos. Esses rótulos são as constantes 1, 3 e 10.
switch (valor) {
case 1:
("A\n");
printf("B\n");
printf("C\n");
printf("D\n");
printfcase 3:
("E\n");
printf("F\n");
printf("G\n");
printfcase 10:
("H\n");
printf("I\n");
printf}
Para essa organização, o funcionamento do switch
avalia a expressão (variável valor
) e inicia a execução da lista de comandos a partir do case
em que houver igualdade.
Assim, se valor
for igual a 1, todos os printf
são executados; se for igual a 3, a execução se inicia no printf("E\n")
e vai até o final; e se for igual a 10, somente H e I são escritos. Para qualquer outro valor, nada é escrito, pois não existe o rótulo indicando em que posição da lista começa a execução.
O programa seguinte contém a implementação completa do exemplo apresentado.
/*
Exemplo de escolha de execução com switch
*/
#include <stdio.h>
int main(void) {
char entrada[160];
("Digite um valor inteiro: ");
printf(entrada, sizeof entrada, stdin);
fgetsint valor;
(entrada, "%d", &valor);
sscanf
switch (valor) {
case 1:
("A\n");
printf("B\n");
printf("C\n");
printf("D\n");
printfcase 3:
("E\n");
printf("F\n");
printf("G\n");
printfcase 10:
("H\n");
printf("I\n");
printf}
return 0;
}
3
Digite um valor inteiro:
E
F
G
H I
O conceito da estrutura switch
é ter uma lista de comandos e, por meio dos rótulos, indicam em que posição da lista se inicia a execução.
Para ter um último exemplo de como essa estrutura de seleção funciona, é adicionada uma cláusula default
, que indica que, se não houver nenhum rótulo coincidente, é nesse ponto que a execução se inicia.
/*
Exemplo de escolha de execução com switch
*/
#include <stdio.h>
int main(void) {
char entrada[160];
("Digite um valor inteiro: ");
printf(entrada, sizeof entrada, stdin);
fgetsint valor;
(entrada, "%d", &valor);
sscanf
switch (valor) {
case 1:
("A\n");
printf("B\n");
printf("C\n");
printf("D\n");
printfcase 3:
("E\n");
printf("F\n");
printf("G\n");
printfcase 10:
("H\n");
printf("I\n");
printfdefault:
("Y\n");
printf("Z\n");
printf}
return 0;
}
4
Digite um valor inteiro:
Y Z
Talvez sejam raros os casos em que um problema consiga usar o switch
conforme apresentado até o momento, visto que a lista de comandos é sempre executada até o final.
Dessa forma, é comum a inserção de uma interrupção na sequência de comandos e, para isso, é usada a instrução break
. O exemplo seguinte é uma nova versão do programa, agora limitando até onde a lista executa.
Quando um break
é encontrado, o switch
é interrompido naquele ponto.
/*
Exemplo de escolha de execução com switch
*/
#include <stdio.h>
int main(void) {
char entrada[160];
("Digite um valor inteiro: ");
printf(entrada, sizeof entrada, stdin);
fgetsint valor;
(entrada, "%d", &valor);
sscanf
switch (valor) {
case 1:
("A\n");
printf("B\n");
printf("C\n");
printf("D\n");
printfbreak;
case 3:
("E\n");
printf("F\n");
printf("G\n");
printfbreak;
case 10:
("H\n");
printf("I\n");
printfbreak;
default:
("Y\n");
printf("Z\n");
printf}
return 0;
}
1
Digite um valor inteiro:
A
B
C D
Nesta versão, a mais completa e usual, mostra como, dependendo de um dado valor, apenas uma lista específica de instruções é executada.
Para um exemplo mais prático, pode ser o problema de ler uma expressão com dois operandos e um operador aritmético simples e apresentar o resultado (Algoritmo 8.1).
Algoritmo 8.1: Cálculo de uma expressão aritmética simples a partir dos operandos e do operador.
/*
Realização de uma operação aritmética simples dados os operandos e o
operador
Requer: operando1, operador e operando2
Assegura: o resultado da operação ou mensagem se o operador for
desconhecido
*/
#include <stdio.h>
#include <stdbool.h>
int main(void) {
char entrada[160];
("Digite uma operação aritmética (sem espaços): ");
printf(entrada, sizeof entrada, stdin);
fgetsdouble operando1, operando2;
char operador;
(entrada, "%lf%c%lf", &operando1, &operador, &operando2);
sscanf
double resultado;
bool eh_operador_valido = true;
switch (operador) {
case '+':
= operando1 + operando2;
resultado break;
case '-':
= operando1 - operando2;
resultado break;
case '*':
= operando1 * operando2;
resultado break;
case '/':
= operando1 / operando2;
resultado break;
default:
= false;
eh_operador_valido }
if (eh_operador_valido)
("%g %c %g = %g.\n", operando1, operador, operando2, resultado);
printfelse
("Operador não reconhecido.\n");
printf
return 0;
}
1.75*-3.1
Digite uma operação aritmética (sem espaços): 1.75 * -3.1 = -5.425.
8.2 Limitações do switch
Embora bastante útil, o switch
serve apenas para comparações de igualdade, não permitindo verificações de intervalos, por exemplo.
Outra limitação é que a expressão usada tem que ser inteira ou char
. Valores reais não podem ser usados.