文字列リテラルの連結: 詳細
C では、連結演算子 " " を使用して文字列を結合できますが、文字列リテラルを操作する場合の制限事項。これらの制限を調べて、その背後にあるセマンティクスを理解しましょう。
Accelerated C からの引用が示唆しているように、「」を使用して 2 つの文字列リテラルを直接連結することはできません。これは、文字列リテラルが文字配列として格納されており、そのような配列への 2 つのポインターを連結しようとすると未定義の動作が発生するためです。
次の例を考えてみましょう。
<code class="cpp">const string hello = "Hello"; const string message = hello + ",world" + "!"; // Valid</code>
この場合、 hello は const 文字列オブジェクトで、一番左の " " の引数の 1 つです。この連結の結果は、「Hello,world」を含む新しい文字列オブジェクトです。この新しい文字列は「!」で連結されます。
ただし、この例では、
<code class="cpp">const string exclam = "!"; const string message = "Hello" + ",world" + exclam; // Invalid</code>
「 = 演算子は左から右への結合性があるため、コンパイル エラーが発生します。」これは、括弧で囲まれた式と同等のものが次のとおりであることを意味します。
<code class="cpp">const string message = (("Hello" + ",world") + exclam);</code>
ここで、「Hello」と「,world」は両方とも文字列リテラルであり、2 つの文字列リテラルを直接連結することはできないため、式 ("Hello " ",world") は無効です。
この問題を解決するには、括弧を使用して 2 番目の " " を最初に評価するように強制できます。
<code class="cpp">const string message = "Hello" + (",world" + exclam);</code>
あるいは、文字列リテラルの 1 つからの文字列オブジェクト:
<code class="cpp">const string message = string("Hello") + ",world" + exclam;</code>
一般に、連結される最初の 2 つの文字列の 1 つは std::string オブジェクトである必要があります。
これらのセマンティクスを理解することは、次の場合に重要です。 C で文字列リテラルを操作します。これらのガイドラインに従うことで、文字列リテラルに関連する一般的な落とし穴を回避しながら、文字列を効果的に連結できます。
以上がC での文字列リテラルの連結に関する制限は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。