C で 2 つの文字列リテラルを直接連結できますか?

Susan Sarandon
リリース: 2024-10-24 08:48:29
オリジナル
360 人が閲覧しました

Can You Concatenate Two String Literals Directly in C  ?

文字列リテラルの連結

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」が最初に連結され、コンパイル時にエラー。

制限の克服

この制限を克服するには、いくつかの方法があります。

  1. std::string を使用するオブジェクト:
<code class="cpp">const string message = string("Hello") + ",world" + exclam;</code>
ログイン後にコピー
  1. 式を括弧で囲みます:
<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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!