別の条件が必要です -- 高速な実行時間を維持しますが、より安全です -- どちらかまたは両方の文字列が空の場合に 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
true になります) 。
コンパイラを裏切ろうとしないでください。高速なコードを書くということは、できるだけ少ない行のコードを書くことでも、できるだけ短い行を書くことでもありません。このように連鎖する==
ことが意味のあるものであったとしても、より高速になる理由はありません。自分が理解し、正しく書けるコードを書くだけです。
のコードは次の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;
}
それはすでに有意義な速度です。余分なチェックは、興味のないケースを遅くするだけです。
あなたが提案した初期段階のテストを正しく実装したとしても、この種のことを行うことによって物事が速くなる可能性はほとんどありません -strcmp
すでにこれを行っているか、ほぼこれを行っているでしょう。
if( *str1 == 0 || *str2 == 0 )
return 0;
あなたが与えた例は正しく動作しません。strcmp()
最初の異なる文字で停止します。上記の「特別なケース」で満たされるように、両方の文字列が空の場合、これは、指定した例と同じくらい迅速に処理されます。
上記のように両方の文字列を空にする特別なハンドラーを追加することで、空でない場合のみを作成し、それに応じて遅くなります。