Jump to content
Sign in to follow this  
fredericopissarra

Uma dica rápida...

Recommended Posts

Não sei se já postei isso por aqui, mas aqui vai uma dica rápida para aquelas funções que precisamos criara para comparações, usadas em funções como qsort() e bsearch(). Ambas têm o protótipo:

void qsort( void *base, size_t nmemb, size_t size, int (*comp)(const void *, const void *) );
void *bsearch( const void *key, const void *base, size_t nmemb, size_t size, int (*comp)(const void *, const void *) );

Esse ponteiro para a função de comparação espera uma função que retorne <0, 0 ou >0. No caso do qsort() poderemos ficar tentados a escrever uma rotina assim, para ordenação ascendente de um buffer contendo int's:

int mycomp( const void *a, const void *b )
{
  if ( *(const int *)a < *(const int *)b ) return -1;
  else if ( *(const int *)a > *(const int *)b ) return 1;
  else return 0;
}

Ou algo similar... É uma boa rotina, mas essa é melhor:

int mycomp( const void *a, const void *b )
{ return ( *(const int *)a > *(const int *)b ) - ( *(const int *)a < *(const int *)b ); }

Repare que todo resultado de expressão contendo comparações é sempre 0 ou 1 ( e do tipo int )... Ao comparar se (a > b) obtemos 0 ou 1. Mesma coisa para a comparação (a < b)... E, não parece, mas esse último código é um cadinho mais rápido (e menor) que o anterior... Se quiser fazer a rotina mais legível:

int mycomp( const void *a, const void *b )
{
  const int *a_ = a, *b_ = b;

  return ( *a_ > *b_ ) - ( *a_ < *b_ );
}

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...