1

strcmp、stricmp、compare などである種の基本的な認識の問題があります。私は彼らが何をしているのか、なぜそれをしているのかを知っていますが、等価性をチェックしているときは、自然に「if ( strcmp() )」と書きます。 ..」それは逆のロジックであり、「if ( 0==strcmp() )...」と書くことは (後でコード ブロックが機能しなくなるまで) 思い浮かびません。私はこれを常に行っており、開発が遅くなります。これについて私の頭脳を逆転させるヒントはありますか?

関数に「strdoesntcmp」という名前を付ける必要があったようです...(はい、その方法よりも小さいまたは大きいために使用できないことはわかっています...)。確かに #define または inline を使用してそのようなことを行うことはできますが、それはハックです...それが理にかなっていれば、自然な考えを逆にしたいだけです...

4

4 に答える 4

4

最善の答えは、strcmp完全に忘れることです。

std::string s1 = "one";
std::string s2 = "two";
if (s1 == s2) // ...

編集:アセンブリに精通していれば、strcmp関数はまったく混乱しないでしょう。多くのプロセッサにはCMP、結果を格納せずに 2 つの値の減算を行う命令があり、結果が負、ゼロ、正のいずれであったかを示す条件フラグを設定するだけです。strcmp文字列で同じことをシミュレートするだけです。

于 2012-09-10T19:03:18.633 に答える
4
int streq( char const* s1, char const* s2)
{
    return 0 == strcmp(s1, s2);
}

inlineパフォーマンスのオーバーヘッドが気になる場合。

于 2012-09-10T19:03:59.820 に答える
2

考えてみてください、その比較は実際には減算です (マイクロプロセッサの命令もそのように機能しています)。Sostrcmpは と呼ばれるstrsub場合があり、このように 0 は文字列が等しいことを意味します。

strcmpまたは、独自に仕様を実装します。あなたがそれを解決している間、戻り値は のようにあなたの心にくっつきます1x1

また、一度stackOverflowに投稿すると、いつも忘れていて(0==strcmp)、それに対して多くの混乱した回答を得ていると考えることができます. これを覚えておけば、compareオペレーターがオペレーターではないことを頭で誤解することはもうありませんequality

于 2012-09-10T19:03:57.013 に答える