0

次のような if ステートメントでは:

    if(strcmp(str1,str2))

strcmp() は負の値を返すことができ、その場合、if ステートメントはそれを TRUE または FALSE と見なします。

4

4 に答える 4

12

C++ では、ifステートメントはゼロ以外の値を真として扱います。負の値はゼロではないため、真と見なされます。次の 2 つのステートメントは同等です。

if (strcmp(str1, str2))

if (strcmp(str1, str2) != 0)
于 2013-09-01T23:31:20.053 に答える
1

strcmp関数を if ステートメントで使用すると、非常に判読不能なコードになる可能性があります。次のステートメントは、が と異なるfoo場合にのみ呼び出すことを示しています。str1str2

if (strcmp(str1, str2)) foo();

これはやや予想外で読みにくいと主張する人もいますが、strcmpこれはbool. この優れたリファレンスを確認すると、文字列間の関係を示すための整数値が返されることがわかります。strcmp2 つの文字列が同じかどうかだけではありません。strcmp参照リターンによると:

  • 両方の文字列が等しい場合は 0
  • 一致しない最初の文字の値が instr1よりも大きい場合は正の値str2
  • 一致しない最初の文字の値が instr2よりも大きい場合は負の値str1

if ステートメントはゼロ以外の整数値をtrueif ステートメントのブール値に強制するため、とが等しい場合を除いてif (strcmp(str1, str2)) foo()常に解釈trueして実行します (この場合、if ステートメントは解釈され、foo は実行されません)。foostr1str2false

if ステートメントで strcmp を使用するより一般的な方法は、strcmp への呼び出しを if ステートメント内のバイナリ比較と組み合わせて、整数値に対してテストすることです。

if (strcmp(str1, str2) == 0) foo(); // foo executed iff str1 and str2 are equal
if (strcmp(str1, str2) != 0) foo(); // foo executed iff str1 and str2 are not equal

また、if ステートメントを使用strcmpして文字列を並べ替えることもできます。strcmp は、文字列の最初の一致しない文字に基づいて返されるため、これに最適です。次のようなもので使用できます(テストされていないコード):

bool swapped = false;
do {
    for (i = 1; i < numStrings; i++) {
        if (strcmp(str[i-1], str[i]) > 0) {
            swap(i-1, i);
            swapped = true;
        }
    }
} while (swapped);
于 2013-09-02T00:52:28.817 に答える
0

整数値がブール値に変換される場合、0 は false で、その他の値は true です。

于 2013-09-01T23:33:04.540 に答える
0

C はゼロ以外の値を に変換し、trueゼロのみがに変換されますfalse

if(strcmp(str1, str2))ほとんど常に「間違っている」ことに注意してください。次のいずれかが必要です。

  • if (strcmp(str1, str2) == 0)2 つの文字列が等しいことを検出する
  • if (strcmp(str1, str2) > 0)それを検出するstr1 > str2
  • if (strcmp(str1, str2) < 0)それを検出するstr1 < str2

唯一の理由は、それが異なるif(strcmp(str1, str2))ことを検出するためです。これは、ほとんどの場合、必要なものではありません。str1str2

strcmpそして当然のことながら、C++ では、おそらくまったく使用すべきではありません。たとえば、 or など、std::string必要なものを比較として記述できるため、ほとんどの人にとって、それが何を意味するかは、それ以上質問しなくてもすぐにわかります。if (str1 > str2)if (str1 != str2)

于 2013-09-01T23:47:41.107 に答える