難問: C での文字列と文字の連結の謎
C で文字列リテラルと文字リテラルを連結しようとすると、予期しない動作が発生する生じる可能性があります。次のコードを考えてみましょう:
<code class="cpp">string str = "ab" + 'c'; cout << str << endl;</code>
興味深いことに、この行の出力は「abc」になります。この謎を解明するには、基礎となる操作を理解することが重要です。
内部では、コンパイラーは文字列リテラル「ab」を C スタイルの文字列として解釈し、文字リテラル 'c' を整数値として解釈します。これらの型では文字列の連結が定義されていないため、コンパイラは整数値「c」を文字列リテラルのアドレスに追加します。
この操作は、文字列に割り当てられたメモリを超過するため、予測できない結果を招く可能性があります。 。その結果、プログラムは、null 文字が見つかるまで、結果のアドレスから文字を出力する可能性があります。
この問題を解決するには、いくつかの方法が考えられます。まず、キャストを使用して文字リテラルを文字列に明示的に変換できます:
<code class="cpp">string str = std::string("ab") + 'c';</code>
または、直感的な連結を実行する文字列連結演算子を使用できます:
<code class="cpp">string str = "ab"; str += 'c';</code>
2 番目のケースでは、文字列クラスのオーバーロードされた演算子メソッドがシームレスな連結に利用されます。
以上が## C で文字列リテラルと文字リテラルを連結すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。