C での文字列リテラルと文字リテラルの連結
C では、文字列と文字の連結に演算子を使用できます。ただし、この動作は関係するオペランドのタイプによって異なります。
次のコードを考えてみましょう。
<code class="cpp">string str = "ab" + 'c'; cout << str << endl;</code>
このコードは、期待どおりに出力「abc」を生成します。これは、文字列リテラル「ab」が自動的に const char* ポインターに変換されるためです。文字リテラル「c」は整数値に昇格され、文字列リテラルのアドレスに追加されます。結果は、文字 "abc" を含む新しい文字列になります。
ただし、次の代替案を検討してください。
<code class="cpp">char ch = 'c'; string str1 = "ab"; string str2 = str1 + ch; cout << str2 << endl;</code>
このコードでは、予期しない出力 "ed" が生成されます。
この動作を理解するには、まず文字列 str1 が const char* ではなく string 型であることを確認する必要があります。文字列に ch という文字を追加すると、コンパイラは文字列オブジェクトに対してオーバーロードされた演算子を使用しようとします。ただし、string と char には演算子のオーバーロードはありません。
この曖昧さを解決するために、コンパイラは ch を整数に昇格させ、最初の例のように加算を実行します。ただし、結果のアドレスは文字列 str1 に割り当てられたメモリを超えているため、未定義の動作が発生します。 NULL 文字が検出されるまで文字はこのアドレスから取得され、予期しない出力が発生します。
この動作を防ぐには、'c' を追加する前に "ab" を文字列に明示的にキャストできます:
<code class="cpp">string str = std::string("ab") + 'c';</code>
代わりに、連結演算子 =:
<code class="cpp">string str = "ab"; str += 'c';</code>
を使用することもできます。これらのアプローチは両方とも、結果が有効な文字列であることを保証します。
以上がC で文字を文字列に連結すると、予期しない出力が発生する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。