Código feio I

Uma coisa que gosto e preciso fazer é ler código fonte. Acho que tem o mesmo espírito de ler um livro, você agrega conhecimento e vê outras formas de escrever e de expor idéias e soluções. Algumas vezes me deparo com um código esquisito, por exemplo este trecho em C:

00045 // Iterate through every possible codeword
00046 codeword = 0;
00047 while (codeword < numEntries)
00048 {
00049 // Initialize list of query positions as empty
00050 initialLookup[codeword].queryPositions = NULL;
00051 initialLookup[codeword].numQueryPositions = 0;
00052 initialLookup[codeword].allocQueryPositions = 0;
00053
00054 codeword++;
00055 }

Este não é um código difícil de entender, mas é no mínimo estranho utilizar um while para designar este tipo de iteração. Um while normalmente é utilizado quando não conhece o limite, ou seja: “enquanto tal operação for verdadeira, faça”. Um exemplo é para ler um arquivo: “enquanto não for fim do arquivo, leia”.

Para casos onde sabe-se o começo, o intervalo e especialmente o fim, o for é a estrutura de laço correta. No exemplo dado, sabe-se o início, que é zero, o intervalo, é mais um e o fim que é menor do que o numEntries, então não ficaria mais legível desta forma:

00045 // Iterate through every possible codeword
00046 int codeword;
00047 for(codeword = 0; codeword < numEntries; codeword++) {
00048 // Initialize list of query positions as empty
00049 initialLookup[codeword].queryPositions = NULL;
00050 initialLookup[codeword].numQueryPositions = 0;
00051 initialLookup[codeword].allocQueryPositions = 0;
00052 }

Apenas lendo o a linha 47, sabe-se que ira iniciar em 0 e iterará entre todos os valores até que seja menor que numEntries. Então, quando for fazer uma iteração entre valores conhecidos, é o for e quando for executar uma ação e não sabe-se previamente quando ela será finalizada, utilize o while.

4 thoughts on “Código feio I

  1. Olá. Também me divirto lendo códigos… hehehe

    Nesse caso, acho que no for, deveria ser usado <=, já que codeword = 0. Se numEntries for maior que codeword o laço pode ser simplesmente pulado.
    Por isso foi usado o while. “Enquanto codeword for menor que numEntries, faça”. No for está assim: “para codeword = 0, faça até codeword for menor que numEntries”, portanto se numEntries for menor que codeword o laço não seria executado.

  2. O codeword tem que ser < , pois se for <= a ultima posição será igual ao tamanho do vetor alocado, acessando uma área inválida da memória.

    No momento de execução deste código, numentries será maior que codeword, ou em algum caso excepcional, será igual, se ambos forem 0.

  3. ehheeh!
    Eu ja vi um desse fonte em um otimo sistema que eh muito bem vendido!

    if (a == b)
    a = b;

    Ate hj eu nao sei o que passou na cabeça do programador, foi um consultar que sabe nada de algoritmo que descobriu! xD

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s