文字列リテラルの連結
C では、演算子を使用して文字列を連結できます。ただし、文字列リテラルを連結するときに従うべき特定の規則があります。
文字列定義の有効性
次のコードは 2 つの文字列変数を定義します:
<code class="cpp">const string hello = "Hello"; const string message = hello + ",world" + "!";</code>
連結される 2 つの文字列の 1 つが std::string オブジェクト (こんにちは) であるため、このコードは有効です。演算子は最初に hello と ",world" の連結を評価し、結果として std::string オブジェクトが生成されます。次に、このオブジェクトは「!」で連結されます。
ただし、次のコードは無効です:
<code class="cpp">const string exclam = "!"; const string message = "Hello" + ",world" + exclam;</code>
左端で連結されている両方の文字列が文字列リテラル (" 「こんにちは」と「、世界」)。この演算子を使用して 2 つの文字列リテラルを直接連結することはできません。
演算子の左から右への結合性
C の演算子には左から右への結合性があります。これは、2 番目のコード例の同等の括弧で囲まれた式が次のとおりであることを意味します。
<code class="cpp">const string message = (("Hello" + ",world") + exclam);</code>
ご覧のとおり、2 つの文字列リテラル「Hello」と「,world」が最初に連結され、コンパイル時にエラー。
制限の克服
この制限を克服するには、いくつかの方法があります。
<code class="cpp">const string message = string("Hello") + ",world" + exclam;</code>
<code class="cpp">const string message = "Hello" + (",world" + exclam);</code>
制限の理由
2 つの文字列リテラルを直接連結できないという制限は、文字列リテラルが文字の配列 (const char [N]、N は文字列の長さに 1 を加えたもの) であるためです。ヌル終端文字)。ほとんどのコンテキストで配列を使用すると、配列はその最初の要素へのポインタに変換されます。
したがって、 を使用して 2 つの文字列リテラルを連結しようとすると、実質的に 2 つの const char* ポインタを加算しようとすることになります。 。文字列連結のコンテキストでは 2 つのポインターを追加することは意味をなさないため、これは不可能です。
以上がC で 2 つの文字列リテラルを直接連結できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。