Eu estava lendo Por que temos para uso break
em switch
? , e me levou a pensar por que o fall-through implícito é permitido em algumas linguagens (como PHP e JavaScript), enquanto não há suporte (AFAIK) para o fall-through explícito.
Não é como se uma nova palavra-chave precisasse ser criada, como continue
seria perfeitamente apropriada e resolveria quaisquer problemas de ambiguidade, para saber se o autor pretendia que um caso ocorresse.
O formulário atualmente suportado é:
switch (s) {
case 1:
...
break;
case 2:
... //ambiguous, was break forgotten?
case 3:
...
break;
default:
...
break;
}
Considerando que faria sentido para ele ser escrito como:
switch (s) {
case 1:
...
break;
case 2:
...
continue; //unambiguous, the author was explicit
case 3:
...
break;
default:
...
break;
}
Para os fins desta pergunta, vamos ignorar a questão de saber se os fall-throughs são ou não um bom estilo de codificação.
Existem idiomas que permitam falhas e o tornassem explícito?
Existem razões históricas que switch
permitam falhas implícitas em vez de explícitas?
switch-statement
zzzzBov
fonte
fonte
goto case
, portanto a premissa da sua pergunta está um pouco errada.goto case
em c #.goto case
, como pdr menciona.Respostas:
É principalmente histórico, a maioria dos idiomas copiou o que C fez.
A razão pela qual C fez dessa maneira é que os criadores de C pretendiam que as instruções de switch fossem fáceis de otimizar em uma tabela de salto. Essa também é a razão pela qual C limita as instruções da chave a valores integrais.
Em uma tabela de salto, o programa calculará para qual posição saltar com base na expressão. O programa pulará para esse ponto e continuará executando a partir desse ponto. Se você quiser pular o restante da tabela, precisará incluir um salto para o final da tabela. C usa
break
instruções explícitas para que haja uma correspondência direta com essa construção.fonte
break
e apenas menos de 3% eram falhos. . Ele então usou isso como um exemplo de que o comportamento de fall-through padrão é contra-intuitivo e seria melhor reverter (use uma palavra-chave para indicar fall-through explícito). Ah, e o livro também é ótimo em explicar outras esquisitices do C, algumas das quais são encontradas em C ++ e até em C # e Java também! Está tudo enraizado em B e BCPL. :)case
, exceto o primeiro, deva ser prefixado automaticamentebreak
, mas os marcados+case
(ou algum outro designador) não devem. Isso teria sido fácil para um compilador manipular e permitir as vantagens semânticas da organização atual, ao mesmo tempo em que eliminava muitas linhas de código.Go permite explicação explícita usando a
fallthrough
palavra - chave (break está implícito, mas pode ser explícito):Aqui está o trecho relevante do início eficaz e as especificações de idioma .
Eu não acho que você pode usar
goto
para ir a um caso específico, mas você pode fazer uma etiqueta dentro do caso e usar umgoto
normal.Como bônus, o Go permite usar expressões binárias, seqüências de caracteres ou tipos em uma opção como instruções de caso.
fonte