isso é uma boa maneira de fazer um strcmp para false retorno quando cadeias estão vazias

StackOverflow https://stackoverflow.com/questions/1606596

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu quero outra condição --still manutenção de um tempo de execução rápido, mas segura - onde eu retornar false se uma ou ambas as cordas está vazia:

int speicial_strcmp(char *str1, char* str2 )
{

    if(*str1==*str2 =='\0')
         return 0;

     return strcmp(str1,str2);

}
Foi útil?

Solução

Não, isso não é uma boa maneira de fazê-lo, porque ele não funciona.

if(*str1==*str2 =='\0')

vai ser avaliada como:

bool tmp1 = *str1==*str2;
bool tmp2 = tmp1 == '\0';
if (tmp2)

Em outras palavras, porque o bool será promovido para um inteiro, o teste retornará true sempre que as cordas começar com personagens diferentes (tmp1 será falso, que é convertido em 0, e assim tmp2 torna-se verdade)

Não tente ser mais esperto que o compilador. Escrever código rápido não é sobre a escrita como algumas linhas de código possível, ou mesmo como linhas curtas quanto possível. Mesmo se encadeando == desta maneira foi significativa, não há nenhuma razão pela qual seria mais rápido. Apenas escrever código que você entenda, e pode escrever corretamente.

Outras dicas

Mesmo se você implementar os primeiros testes-out que você sugere corretamente, você é muito improvável para tornar as coisas mais rápido, fazendo esse tipo de coisa - strcmp já vai estar fazendo isso ou quase isso

.

Aqui está o código para strcmp():

int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

Já é tão rápido como ele poderia significativamente ser. Seu cheque estranho só faz os casos, você não está interessado, mais lento.

if( *str1 == 0 || *str2 == 0 )
   return 0;

O exemplo que você deu não vai mesmo funcionar corretamente. strcmp() vai parar nos personagens primeiro diferentes. Se ambas as cordas estão vazios, como satisfeita por seu "caso especial" acima, este será tratado tão rapidamente como o exemplo que você deu.

Ao adicionar um manipulador especial para ambas as cadeias vazias como acima, você só fez os casos em que eles não são, correspondentemente mais lenta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top