次のような if ステートメントでは:
if(strcmp(str1,str2))
strcmp() は負の値を返すことができ、その場合、if ステートメントはそれを TRUE または FALSE と見なします。
C++ では、if
ステートメントはゼロ以外の値を真として扱います。負の値はゼロではないため、真と見なされます。次の 2 つのステートメントは同等です。
if (strcmp(str1, str2))
if (strcmp(str1, str2) != 0)
strcmp
関数を if ステートメントで使用すると、非常に判読不能なコードになる可能性があります。次のステートメントは、が と異なるfoo
場合にのみ呼び出すことを示しています。str1
str2
if (strcmp(str1, str2)) foo();
これはやや予想外で読みにくいと主張する人もいますが、strcmp
これはbool
. この優れたリファレンスを確認すると、文字列間の関係を示すための整数値が返されることがわかります。strcmp
2 つの文字列が同じかどうかだけではありません。strcmp
参照リターンによると:
str1
よりも大きい場合は正の値str2
str2
よりも大きい場合は負の値str1
if ステートメントはゼロ以外の整数値をtrue
if ステートメントのブール値に強制するため、とが等しい場合を除いて、if (strcmp(str1, str2)) foo()
常に解釈true
して実行します (この場合、if ステートメントは解釈され、foo は実行されません)。foo
str1
str2
false
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);
整数値がブール値に変換される場合、0 は false で、その他の値は true です。
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))
ことを検出するためです。これは、ほとんどの場合、必要なものではありません。str1
str2
strcmp
そして当然のことながら、C++ では、おそらくまったく使用すべきではありません。たとえば、 or など、std::string
必要なものを比較として記述できるため、ほとんどの人にとって、それが何を意味するかは、それ以上質問しなくてもすぐにわかります。if (str1 > str2)
if (str1 != str2)