ホームページ > バックエンド開発 > C++ > を使用した文字列連結が文字列リテラルで失敗するのはなぜですか?

を使用した文字列連結が文字列リテラルで失敗するのはなぜですか?

Susan Sarandon
リリース: 2024-10-24 08:32:30
オリジナル
779 人が閲覧しました

Why Did String Concatenation Using   Fail with String Literals?

文字列リテラルと文字列の連結

C では、演算子を使用して文字列と文字列リテラルを連結できます。ただし、この機能には混乱を招く可能性のある制限があります。

質問の中で、作成者は文字列リテラル「Hello」、「,world」、および「!」を連結しようとしています。 2つの異なる方法で。最初の例:

<code class="cpp">const string hello = "Hello";
const string message = hello + ",world" + "!";</code>
ログイン後にコピー

この場合、コードは正常にコンパイルされ、実行されます。これは、演算子の最初のオペランドが文字列オブジェクト (hello) であるため、コンパイラはこれを文字列と 2 つの文字列リテラルの連結として扱います。

ただし、2 番目の例:

<code class="cpp">const string exclam = "!";
const string message = "Hello" + ",world" + exclam;</code>
ログイン後にコピー

はコンパイルに失敗します。これは、左端の演算子が 2 つの文字列リテラルを連結しようとしているためですが、これは許可されていません。コンパイラーはこのコードを次のように解釈します:

<code class="cpp">const string message = (("Hello" + ",world") + exclam);</code>
ログイン後にコピー

最初の連結では 2 つのポインター (const char* リテラル) を追加しようとしています。

この問題を解決するには、コードは次のいずれかを行う必要があります。

  • 連結される最初の 2 つの文字列の 1 つを文字列オブジェクトにします:

    <code class="cpp">const string message = string("Hello") + ",world" + exclam;</code>
    ログイン後にコピー
  • 括弧を使用して 2 番目の文字列が最初に評価されるように強制します。 :

    <code class="cpp">const string message = "Hello" + (",world" + exclam);</code>
    ログイン後にコピー

を使用して 2 つの文字列リテラルを連結できない理由は、文字列リテラルが文字の配列として保存され、直接加算できないためです。ほとんどのコンテキストで文字列リテラルを使用すると、その最初の要素へのポインターに変換されますが、これは演算子の有効なオペランドではありません。

したがって、左端の 2 つのオペランドのうちの 1 つだけを使用できることを覚えておくことが重要です。連結式では文字列リテラルを使用できます。ただし、文字列リテラルは、

<code class="cpp">"Hello" ",world"
"Hello,world"</code>
ログイン後にコピー
のように並べて配置することで連結できます。

以上がを使用した文字列連結が文字列リテラルで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート