это хороший способ сделать strcmp для возврата false, когда строки пусты - PullRequest
0 голосов
/ 22 октября 2009

Я хочу другое условие - по-прежнему поддерживать быстрое время выполнения, но безопаснее - где я возвращаю false, если одна или обе строки пусты:

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

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

     return strcmp(str1,str2);

}

Ответы [ 5 ]

12 голосов
/ 22 октября 2009

Нет, это не очень хороший способ сделать это, потому что он не работает.

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

будет оцениваться как:

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

Другими словами, поскольку bool будет преобразован в целое число, ваш тест будет возвращать значение true, когда строки начинаются с разных символов (tmp1 будет иметь значение false, которое преобразуется в 0, и поэтому tmp2 становится истинным )

Не пытайтесь перехитрить компилятор. Написание быстрого кода не сводится к написанию как можно меньшего количества строк кода или даже как можно более коротких строк. Даже если объединение == таким образом имело бы смысл, нет причины, почему это было бы быстрее. Просто напишите код, который вы понимаете, и можете писать правильно.

4 голосов
/ 22 октября 2009

Вот код для 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;
}

Это уже так быстро, как могло бы быть. Ваш посторонний чек делает дела, которые вам не интересны, медленнее.

4 голосов
/ 22 октября 2009

Даже если вы реализуете ранние тесты, которые вы предлагаете правильно, вы вряд ли сделаете что-то быстрее, если будете делать подобные вещи - strcmp уже будет делать это или почти это.

3 голосов
/ 22 октября 2009
if( *str1 == 0 || *str2 == 0 )
   return 0;
1 голос
/ 22 октября 2009

Пример, который вы дали, даже не будет работать правильно. strcmp() остановится на первых отличающихся символах. Если обе строки пусты, что удовлетворяет вашему «особому случаю» выше, это будет обработано так же быстро, как и в приведенном вами примере.

Добавив специальный обработчик для обеих пустых строк, как описано выше, вы только сделали случаи, когда они не являются, соответственно, медленнее.

...