Por que a instrução switch e não if-else?

Eu tenho me perguntado isso há algum tempo agora. Eu não sou, de longe, um programador hardcore, principalmente pequenos scripts Python, e escrevi algumas simulações de dinâmica molecular. Para a pergunta real: Qual é o objective da instrução switch ? Por que você não pode simplesmente usar a instrução if-else ?

Obrigado pela sua resposta e se isso foi solicitado antes por favor me aponte para o link.

EDITAR

S.Lott apontou que isso pode ser uma duplicata de perguntas If / Else vs. Switch . Se você quiser fechar, faça isso. Vou deixá-lo aberto para mais discussões.

Uma construção de switch é mais facilmente traduzida em uma tabela de salto (ou ramificação) . Isso pode tornar as instruções switch muito mais eficientes do que if-else quando os labels de maiúsculas e minúsculas estão próximos. A idéia é colocar um monte de instruções de salto seqüencialmente na memory e, em seguida, adicionar o valor ao contador do programa. Isso substitui uma sequência de instruções de comparação por uma operação add.

Abaixo estão alguns exemplos extremamente simplificados de assembly de psuedo. Primeiro, a versão if-else:

// C version if (1 == value) function1(); else if (2 == value) function2(); else if (3 == value) function3(); // assembly version compare value, 1 jump if zero label1 compare value, 2 jump if zero label2 compare value, 3 jump if zero label3 label1: call function1 label2: call function2 label3: call function3 

Em seguida é a versão do switch:

  // C version switch (value) { case 1: function1(); break; case 2: function2(); break; case 3: function3(); break; } // assembly version add program_counter, value call function1 call function2 call function3 

Você pode ver que o código assembly resultante é muito mais compacto. Observe que o valor precisaria ser transformado de alguma forma para manipular outros valores além de 1, 2 e 3. No entanto, isso deve ilustrar o conceito.

O switch pode ser otimizado pela compilation r – você obterá um código mais rápido.
Também acho que é mais elegante quando se lida com tipos enumeráveis.

Para resumir o comando switch , você terá elegância de performance + código 🙂

Aqui estão alguns links úteis:

  • comparação de velocidade do switch vs if / else em c #
  • Otimização da instrução de troca orientada por feedback (pdf descrevendo a otimização da instrução switch)

Para expressividade, a instrução switch / case permite agrupar vários casos, por exemplo:

 case 1,2,3: do(this); break; case 4,5,6: do(that); break; 

Para desempenho, os compiladores podem, às vezes, otimizar as instruções de troca nas tabelas de salto.

Eu estou ignorando esse tipo de otimização de baixo nível como geralmente sem importância, e provavelmente diferente do compilador para o compilador.

Eu diria que a principal diferença é a legibilidade. if / else é muito flexível, mas quando você vê um switch você sabe imediatamente que todos os testes são contra a mesma expressão.

Além da outra legibilidade e otimização do código mencionada no .NET, você também tem a capacidade de ativar enums, etc.

 enum Color { Red, Green, Blue }; Color c = Color.Red; switch (c) // Switch on the enum { // no casting and no need to understand what int value it is case Color.Red: break; case Color.Green: break; case Color.Blue: break; } 

A capacidade de cair em vários casos (omitindo intencionalmente a declaração de quebra) pode ser útil, e como algumas pessoas já disseram que é mais rápido também. Talvez a consideração mais importante e menos importante, no entanto, é que ela apenas cria um código mais bonito do que se / senão. 🙂

Switch pode ser otimizado “Melhor” por alguns compiladores. Há armadilhas ao usar a instrução switch em determinados idiomas. Em Java, o switch não pode manipular strings e no VB2005 a instrução switch não funcionará com botões de opção.
O switch pode ser mais rápido e mais fácil de ler, o If-Then é mais genérico e funcionará em mais lugares.

As únicas mudanças de horário podem ser mais rápidas quando os valores de seus casos são constantes, não dinâmicas ou derivadas, e quando o número de casos é significativamente maior que o tempo para calcular um hash em uma tabela de consulta.

Caso em questão para o Javascript, que compila para assembly para execução na maioria dos mecanismos, incluindo o mecanismo V8 do Chrome, é que as instruções de switch são 30% -60% mais lentas para executar no caso comum: http://jsperf.com/switch-if -else / 20