ou no switch [RESOLVIDO]

1. ou no switch [RESOLVIDO]

Matheus Perusso
mperusso

(usa Arch Linux)

Enviado em 02/09/2016 - 16:13h

tem algum tipo de ou no switch? no if tem: ||, no switch tem que criar todos os casos separados ou tem um ou?


  


2. MELHOR RESPOSTA

Paulo
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;
}


3. Re: ou no switch [RESOLVIDO]

Matheus Perusso
mperusso

(usa Arch Linux)

Enviado em 03/09/2016 - 02:01h

entendi, só colocar um atrás do outro, valeu.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts