0

我想要另一个条件——仍然保持快速执行时间但更安全——如果一个或两个字符串为空,我返回 false:

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

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

     return strcmp(str1,str2);

}
4

5 回答 5

12

不,这不是一个好方法,因为它不起作用。

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

将被评估为:

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

换句话说,因为 bool 将被提升为整数,所以只要字符串以不同的字符开头,您的测试就会返回 true(tmp1将为 false,它被转换为 0,因此tmp2变为 true)

不要试图智取编译器。编写快速代码并不是要编写尽可能少的代码行,甚至是尽可能短的代码行。即使==以这种方式链接在一起是有意义的,也没有理由让它更快。只需编写您理解并且可以正确编写的代码。

于 2009-10-22T11:36:59.963 回答
4

即使你正确地实施了你建议的早期测试,你也不太可能通过做这种事情来使事情变得更快 -strcmp已经在做这个或接近这个了。

于 2009-10-22T11:33:48.663 回答
4

这是代码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;
}

It's already as fast as it could meaningfully be. Your extraneous check only makes the cases you're not interested in, slower.

于 2009-10-22T11:47:59.017 回答
3
if( *str1 == 0 || *str2 == 0 )
   return 0;
于 2009-10-22T11:34:22.930 回答
1

您给出的示例甚至无法正确运行。strcmp()将在第一个不同的字符处停止。如果两个字符串都是空的,正如您上面的“特殊情况”所满足的那样,这将与您给出的示例一样快地处理。

通过像上面那样为两个字符串都添加一个特殊的处理程序,您只会使它们不是空的情况,相应地变慢。

于 2009-10-22T11:38:56.393 回答