это хороший способ сделать strcmp для возврата false, когда строки пусты
Вопрос
Я хочу другое условие - по-прежнему поддерживать быстрое время выполнения, но безопаснее - где я возвращаю 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 ()
остановится на первых отличающихся символах. Если обе строки пусты, это удовлетворяет ваш " особый случай " выше, это будет обработано так же быстро, как и в приведенном вами примере.
Добавив специальный обработчик для обеих пустых строк, как описано выше, вы только сделали случаи, когда они не являются, соответственно, медленнее.