文字列リテラルと文字列の連結
C では、演算子を使用して文字列と文字列リテラルを連結できます。ただし、この機能には混乱を招く可能性のある制限があります。
質問の中で、作成者は文字列リテラル「Hello」、「,world」、および「!」を連結しようとしています。 2つの異なる方法で。最初の例:
const string hello = "Hello";
const string message = hello ",world" "!";
この場合、コードは正常にコンパイルされ、実行されます。これは、演算子の最初のオペランドが文字列オブジェクト (hello) であるため、コンパイラーはこれを文字列と 2 つの文字列リテラルの連結として扱います。
ただし、2 番目の例:
const string exclam = "!";
const string message = "Hello" ",world" exclam;
はコンパイルに失敗します。これは、左端の演算子が 2 つの文字列リテラルを連結しようとしているためですが、これは許可されていません。コンパイラーはこのコードを次のように解釈します:
const string message = (("Hello" ",world") exclam);
そして最初の連結は 2 つのポインターを追加しようとします (
この問題を解決するには、コードで次のいずれかを行う必要があります:
連結される最初の 2 つの文字列の 1 つを文字列オブジェクトにします:
const string message = string("Hello") ",world" exclam;
2 番目が最初に評価されるようにするには括弧を使用します:
const string message = "Hello" (",world" exclam);
を使用して 2 つの文字列リテラルを連結できない理由は、文字列リテラルが次のように格納されているためです。文字の配列。これらを直接加算することはできません。ほとんどのコンテキストで文字列リテラルを使用すると、その最初の要素へのポインターに変換されますが、これは演算子の有効なオペランドではありません。
したがって、左端の 2 つのオペランドのうちの 1 つだけを使用できることに注意してください。連結式では文字列リテラルを使用できます。ただし、文字列リテラルは、
"Hello" ",world"
"Hello,world"
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3