私の質問はかなりばかげているように聞こえるかもしれませんが、学士試験の準備をしながら答えなければなりません。
では、C++ の 'ab' == "ab" という式についてどう思いますか? これは真実ではありませんか、それとも単に合法的でコンパイルエラーではありませんか? 私は少しググったところ、「ab」はint型であり、「ab」はもちろんそうではないことがわかりました...
コンパイラが何を言っているのかではなく、言語の正式な記述を何を言っているのかを考慮しなければなりません..
私の質問はかなりばかげているように聞こえるかもしれませんが、学士試験の準備をしながら答えなければなりません。
では、C++ の 'ab' == "ab" という式についてどう思いますか? これは真実ではありませんか、それとも単に合法的でコンパイルエラーではありませんか? 私は少しググったところ、「ab」はint型であり、「ab」はもちろんそうではないことがわかりました...
コンパイラが何を言っているのかではなく、言語の正式な記述を何を言っているのかを考慮しなければなりません..
C と C++ の両方で式'ab' == "ab"
が無効です。意味がありません。どちらの言語も、任意の整数値をポインター値と比較することはできません。このため、「真」かどうかという問題すら生じません。コンパイル可能な式に変換するには、オペランドを同等の型に明示的にキャストする必要があります。
ここでの唯一の抜け穴は、複数文字の文字定数の値が実装定義であることです。一部の実装で の値が'ab'
たまたまゼロになった場合、それは null ポインター定数として機能します。その場合'ab' == "ab"
は と と同等に0 == "ab"
なりNULL == "ab"
ます。これは誤りであることが保証されています。
間違いなく警告が生成されますが、デフォルトではgcc
コンパイルされます。通常は false である必要があります。
そうは言っても、理論的には、これを実行しているプラットフォームにもよりますが"ab"
、アドレスの数値が「ab」の数値と等しいメモリ位置にコンパイル時の定数を設定することは可能です。式が真になる場合 (比較はもちろん無意味ですが)。
警告が表示されますが、ビルドされます。マルチバイト整数「ab」を文字列リテラル「ab」のアドレスと比較します。
要するに、比較の結果は、文字が同じかどうかの選択を反映しません。
これを単純な C のパーツと考えてみましょう。文字列を操作する場合、'c' は単純な char であり、文字の配列を使用する必要があります。その結果、'ca' は期待どおりに動作しません。C++ ではこの内容はまだ有効です。String を使用する場合は、生の型ではない String クラスを使用する必要があります。そして、それが行うことはすべて、メソッドと型定義を持つクラスであるため、配列の文字を簡単に処理できます。その結果、結果 'ab' == "ab" は有効なブール値の response を提供しないため、C スタイルの文字列と文字の配列でさえ異なるものになります。これは、int を文字列と比較しようとするようなものです。したがって、この比較はおそらくエラーをスローします。
標準は、整数型とポインターの比較について何も言っていません。それが言うのは次のとおりです(セクション5.9):
オペランドは、算術型、列挙型、ポインター型、または型 std::nullptr_t... を持つ必要があります。
次に、2 つのポインターを比較することの意味について詳しく説明し、2 つの整数の比較について言及します。したがって、仕様の欠如に関する私の解釈は、「コンパイラの作成者が決定するものは何でも」であり、これはエラーまたは警告のいずれかです。