Loop de Várias Váriáveis Em Um Único Laço "For" em C

Publicado por Perfil removido (última atualização em 11/06/2012)

[ Hits: 13.824 ]

Download loop001.c




Das vezes que costumei usar sempre deu certo. :-)

Apenas um truque para não ter que escrever três, quatro laços "for" aninhados.

Pode ser modificado para uso com array criando-se instantaneamente múltiplas variáveis no loop.

Aqui no caso trata-se apenas de um contador com alguma coisa que chama a atenção para o hexadecimal.

Possivelmente improvisa-se algo com sequências em binário.

  



Esconder código-fonte

#include <stdio.h>

main (){

   unsigned int i, j, k, l;

   for (i=0,j=0,k=0,l=0;i<10;l++,k+=(l/16),j+=(k/16),i+=(j/16),l%=16,k%=16,j%=16)
      printf("%d %d %d %d\n", i, j, k, l);

}

Scripts recomendados

Árvore binária - Pré-ordem

Lista encadeada

Pilha

Retorna o tempo ocioso em uma sessão do X

Ordenação de dados


  

Comentários
[1] Comentário enviado por Denommus em 11/06/2012 - 11:55h

Eu acho que um loop aninhado é tão rápido quanto e muito mais legível. Gostei da intenção (inovação é sempre bom), mas não é muito usável num software comercial.

[2] Comentário enviado por removido em 11/06/2012 - 12:55h

Prá mim está bem.
O mérito é que nunca vi até agora isso em livro algum.
Nem em sites, nem alguém que falasse sobre.

Eu descobri isso por puro acidente durante uma aula há uns anos.
Eu simplestente digitei o código e apertei F9 (sim!) e compilou.
Portanto trata-se de mais uma coisa puramente escolar.
Nem acadêmico seria dito.

Por falar em software comercial, será que isso aí funciona em Java ou em C#?
Em algum dos Trẽs Ps? Ou em Javascript?
Provavelmente em C++. D ninguém conhece, então não é tão comercial assim.
Aquelas tranqueiras visuais proprietárias nem pensar...

Esse exemplo é estranho mesmo porque são quatro variáveis.
Quatro loops aninhados? Se "if/else if/else" já é horroroso, imagine quatro loops aninhados?
Se tiver mais de três aninhamentos, há algo errado, típico de se usar uma subrotina.

Não precisa ser 4x1. Pode ser 2x2 também.
Eu nem diria tanto inovação, que se abusar isso deve ser do tempo do K&R.
Devem existir outros exemplos mais obscuros, que passam por completo em desapercebido porque... bem, não importa.
A intenção mesmo foi subverter o senso comum dos "únicos três campos do 'for': arroz, feijão e zoião".
Tem outras coisas, como for(;;) = while(1)

Obs [1]: Nada que fiz aqui até agora tem valor comercial.
Obs [2]: Sem menosprezar a qualquer um que seja. Simplesmente não é.
Obs [3]: Ao menos em Perl loops "while" são muito mais rápidos que for ou foreach.
Obs [4]: Em x86 bytecode não existe for/while. Depende de como o compilador se vira prá gerar o binário.

Fiz mais um experimento:

[code]#include <stdio.h>

main (){

unsigned int i, j, k, l;

for (i=0; i<16; i++)
for (j=0; j<16; j++)
for (k=0; k<16; k++)
for (l=0; l<16; l++)
printf("%d %d %d %d\n", i, j, k, l);

}[/code]

Compilei o código acima, que possui 196 caracteres contra o primeiro, de 183 caracteres.

Resultado:

[1]: Ambos geraram binários de mesmo tamanho em bytes.
[2]: Mesmo tamanho em bytes após serem estripados ("strip -s").

Foi apenas isto, mas existe uma probabilidade grande de o binário ser o mesmo. A velocidade idem.




Pessoalmente nenhum dos dois exemplos possui coisa alguma de elegante.

[3] Comentário enviado por removido em 13/04/2013 - 05:00h


[1] Comentário enviado por Denommus em 11/06/2012 - 11:55h:

Eu acho que um loop aninhado é tão rápido quanto e muito mais legível. Gostei da intenção (inovação é sempre bom), mas não é muito usável num software comercial.


Pensando ainda no que me incomodou. Alem do 162.

Sinceramente tirando a finalidade, não sei o que seria software comercial. Existe um concurso para códigos incompreensíveis. Não é meu intuito, mas por algum motivo existe.

Se existir vinte modos de se fazer uma mesma coisa, poderei simplesmente dominar mais que os vinte. O menor não é o mais curto, talvez fosse o mais rápido. Agora percebo que pode ser o mais legível.

Mesmo que seja cópia de cópias será a primeira escolha. Não há o que criar. Apenas repassar.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts