5

为什么当它在 strcmp 函数内部时,它在 main 中打印出 0 而在 6 中打印出来?

  7 int main()
  8 {
  9 char* str = "test string";
 10 char* str2 = "test strong";
 11 //printf("string length = %d\n",strlen(str));
 12 
 13 int num = strcmp(str,str2);
 14 
 15 printf("num = %d\n",num);
 16 }




 29 int strcmp(char* str, char* str2)
 30 {
 31   if(*str == '\0' && *str2 == '\0')
 32     return 0;
 33   if(*str2 - *str == 0)
 34   {
 35     strcmp(str+1,str2+1);
 36   }
 37   else
 38   {
 39     int num = *str2 - *str;
 40     cout << "num = " <<num<<endl;
 41     return num;
 42     }
 43 }

输出是:

数 = 6 数 = 0

为什么当它显然应该返回的值是 6 时打印 0?

4

2 回答 2

8

您忘记添加return声明了吗?

 33 if(*str2 - *str == 0)
 34   {
 35     return strcmp(str+1,str2+1);
 36   }

否则,代码将跳过if语句的其余部分并到达函数的末尾,什么都不返回(或者0在你的情况下,但那是幸运的)。

仅当两个字符串的第一个字符彼此不同时,您的代码才有效。或者如果两个字符串都为空。

你的编译器应该警告你这一点;voidnon void函数返回。如果没有,你应该编译-Wall:)

于 2012-06-20T08:51:31.123 回答
4

这就是问题:

if(*str2 - *str == 0)
{ 
    strcmp(str+1,str2+1); /* no return here. */
}

意味着代码将一直到结束,没有return,这是未定义的行为:

  • 从C99 标准的第6.9.1 节功能定义:

如果到达终止函数的 },并且调用者使用了函数调用的值,则行为未定义。

  • 从第6.6.3 节C++03 标准的 return 语句:

从函数的末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为。

由于行为未定义,任何事情都可能发生。在这种情况下0被退回。

改成:

if(*str2 - *str == 0)
{ 
    return strcmp(str+1,str2+1);
}
于 2012-06-20T08:51:32.923 回答