5

メインでは 0 が出力され、strcmp 関数内では 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、あなたの場合は幸運です)。

コードは、両方の文字列の最初の文字が互いに異なる場合にのみ機能します。または、両方の文字列が空の場合。

コンパイラはこれについて警告するはずです。void関数から戻りnon 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 に答える