C surprises

Seguindo esta linha de "código perigoso" (vou criar um tag "bomb code") às vezes encontramos coisas que surpreendem e acabam por nos ser útil.

A boa de hoje é esta: Fall through.

"Fall through" significa sair de um loop depois de esgotar o seu limite, em vez de usar um break, segundo o seu conceito original.
Em `C’, também seria: num switch, pular de um case para outro, omitindo o break, no final daquele case.

Esta prática, que as vezes ajuda e até torna o código mais legível, é tida como "perigosa". Exemplo:

switch ( veiculo ) {
  case CARRO:
    lim = 110;
    break;
  case ONIBUS:   /* fall through */
  case VAN:
    lim = 80;
    break; 
  case CARRETA:
    lim = 60;
    break; 
}

Até aqui tudo bem, nada de "impressionante". Porém, podemos chegar ao extremo e obter um resultado como este, surpreendente, conhecido como Duff’s Device.

register n = (count + 7) / 8;      /* count > 0 assumed */

switch (count % 8)
{
  case 0:        do {  *to = *from++;
  case 7:              *to = *from++;
  case 6:              *to = *from++;
  case 5:              *to = *from++;
  case 4:              *to = *from++;
  case 3:              *to = *from++;
  case 2:              *to = *from++;
  case 1:              *to = *from++;
                    } while (--n > 0);   
}

O autor desta obra, a desenvolveu na LucasFilm, quando precisava copiar dados serialmente para uma porta de saída.
Ele sacou que poderia rotacionar os bits passando-os através de uma estrutura entrelaçada entre um loop do-while e um switch.
Adicionalmente, ele postulou que este código cria uma boa base para discussão. Só não dá para dizer é se o debate será contra ou a favor.
E a discussão pode ser vista em Tom Duff on Duff’s Device e as fontes deste artigo em Jargon Files/Glossary/Fall Through

Anúncios

Um comentário sobre “C surprises

  1. Eu já tinha visto algo nesse sentido, mas deixei a dica passar completamente. Ou seja, não prestei atenção. Com certeza a construção é MUITO interessante!!! Maneiro!.

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s