fredericopissarra Posted October 13, 2019 at 01:11 PM Share Posted October 13, 2019 at 01:11 PM 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_ ); } Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.