Boa tarde Thiago,
Ao invés de explicar, deixarei o link e a ótima explicação dada pelo ViniGodoy no GUJ:
http://www.guj.com.br/t/switch-case-qual-e-a-sua-funcao/78862/18
"O switch não testa intervalos. O que esse código fez foi dividir grade por 10, numa divisão de inteiros, para que notas como 80,81,82,83,84,85,87,88 e 89, virassem simplesmente 8.
Com esse artifício, o switch então pode só testar a parte do número na casa das dezenas.
O switch é muito parecido com um if. Um switch assim:
switch (opcao) {
case 1:
fazAlgo();
break;
case 2:
case 3:
fazOutraCoisa();
break;
default:
fazUmaTerceiraCoisa();
break;
}
É equivalente ao if:
if (opcao == 1) {
fazAlgo();
} else if (opcao == 2 || opcao == 3) {
fazOutraCoisa();
} else {
fazUmaTerceiraCoisa();
}
Note que sem o break, o switch faz o que chamamos de "fall through". Ou seja, ele entra na condição que estiver abaixo dele. O exemplo acima é um caso onde usamos fallthrough da maneira correta. Abaixo, mostro um exemplo onde um erro de programação pode gerar um comportamento inesperado:
switch (opcao) {
case 1:
fazAlgo(); //Ops, esqueceu do break
case 2:
fazOutraCoisa();
break.
default:
fazUmaTerceiraCoisa();
break;
}
Isso fica equivalente ao código:
if (opcao == 1) {
fazAlgo();
fazOutraCoisa();
} else (if opcao == 2) {
fazOutraCoisa();
} else {
fazUmaTerceiraCoisa();
}
Não há como testar condições mais complexas no switch. Intervalos por exemplo. Quanto a ser mais legível, também tenho minhas dúvidas.
Eu sempre preferi código com if, e o problema do break é um exemplo de como ele pode prejudicar a legibilidade.
Depois da existência do polimorfismo, o switch e ifs como esses praticamente desapareceram. Mas isso você só vai ver com um pouco mais de estudo na linguagem."