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

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

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

     return strcmp(str1,str2);

}
Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top