paulo1205
(usa Ubuntu)
Enviado em 02/09/2016 - 18:21h
Um exemplo (besta, mas creio que instrutivo) de como conseguir efeitos de ou-lógico:
unsigned char ch;
/* ... Ajusta o valor de ‘ch’ de alguma maneira ... */
if(isdigit(ch)){
switch(ch){
case '0':
case '2':
case '4':
case '6':
case '8':
printf("O dígito é par.\n");
break;
default:
printf("O dígito é ímpar.\n");
}
}
else if(isalpha(ch)){
switch(tolower(ch)){
/* Aproveitando que C não é sensível a quebras de linha (embora eu ache muito feio e confuso)... */
case 'a': case 'e': case 'i': case 'o': case 'u':
printf("A letra é vogal.\n");
break;
default:
printf("A letra é consoante.\n");
}
}
else{
printf("Não é letra nem dígito.\n");
}
Note que acima eu disse que essa é uma forma de conseguir um
efeito de ou-lógico. O sentido real, no entanto, é outro. Os
case labels de um
switch não são realmente casos separados, mas lembram um bocado
labels usados com o comando
goto. Cada
case label é um ponto para a execução pode desviar, dependendo do valor da expressão de controle do
switch, mas o próximo
label não encerra o fluxo de execução do
label anterior. O que encerra o trecho de código iniciado com um
label é o comando
break, que provoca um desvio para fora do bloco associado ao
switch.
unsigned char ch;
/* ... */
switch(tolower(ch)){
case 'a':
printf("A letra pode receber um acento grave (`).\n");
/* Aqui não tem break. Execução prossegue ao longo das linhas que seguem */
case 'o':
printf("A letra pode receber um til (~).\n");
/* Aqui não tem break. Execução prossegue ao longo das linhas que seguem */
case 'e':
/* Aqui não tem break. Execução prossegue ao longo das linhas que seguem */
case 'i':
/* Aqui não tem break. Execução prossegue ao longo das linhas que seguem */
case 'u'
printf("A letra é vogal.\n");
break; /* <--- Note o break. Agora, sim, sai totalmente do switch. */
case 'c':
printf("A letra pode receber uma cedilha.\n");
/* Aqui não tem break. Execução prossegue ao longo das linhas que seguem */
default:
printf("A letra é uma consoante.\n");
/*
Aqui não precisaria de break, porque já é o fim do switch de qualquer jeito.
Contudo, é mais seguro deixar o break, para que novos case labels que venham
a ser incluídos no futuro abaixo desta linha não provoquem alteração do resultado
que já é obtido hoje.
*/
break;
}