質問: 偽"); } return 0; } ```
回答: > > この0は真偽の0とは別の意味ですか? > > > 「意味」という言葉の受け取り方によりそうですが、基本的には別だと考えて良いです。 まず、C 言語の「真偽値」は、Java など他の言語にある Boolean 型の値とは異なり、実体は単なる数値です。C 言語自体のバージョンによって事情が多少異なるものの、いずれも `0` に「偽」の意味を割り当てているだけです。 したがって、`0` に他の意味を割り当てることもできます。`strcmp` 関数では比較結果が「小さい」「等しい」「大きい」の 3 種類であり、これを整数の返り値で表すため、`0` に「等しい」の意味を割り当てています。 これらの歴史的経緯から、`strcmp(str1, str2) == 0` というプログラムは「`strcmp` の返り値が『等しい』を意味しているか調べている」と解釈するのがよく、「`strcmp` の返り値が『偽』なのか調べている」とは解釈しにくいです。この意味で、この `0` は真偽値の `0` とは別の意味です。 > > `if(str3 == "ABC")`はうまく動作してるようですが、実はそう見えてるだけでこれは間違った比較方法なのでしょうか? > > > はい。C 言語で `char *` 型の文字列を比較する際に直接 `==` を使うべきではありません。`str3 == "ABC"` が実際に行っているのはポインタとの比較であり、文字列との比較ではありません。更に、ポインタとの比較は思わぬ動作を引き起こす場合があります。 `strcmp` を使った方が良いことを説明するための例として、`==` と `strcmp` の挙動が異なることを確認できたプログラムを書いてみました。 ``` #include #include int main() { char *s = "ABCDEF"; char *t = s + 3; if (t == "DEF") { printf("==: 等しい\n"); } else { printf("==: 等しくない\n"); } if (strcmp(t, "DEF") == 0) { printf("strcmp: 等しい\n"); } else { printf("strcmp: 等しくない\n"); } return 0; } ``` ポインタ `t` が指し示すのはヌル終端された文字列 `DEF` ですが、Wandbox 上で実行してみると以下のように出力されます。 ``` ==: 等しくない strcmp: 等しい ```