ホームページ  >  記事  >  バックエンド開発  >  C で文字列リテラルを \" \" と連結する場合、直接結合できないのはなぜですか?

C で文字列リテラルを \" \" と連結する場合、直接結合できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-24 08:45:02262ブラウズ

When Concatenating String Literals with

文字列リテラルの連結

Accelerated C では、Koenig は " " 演算子を使用して文字列を連結する機能を導入しました。これは文字列と文字列リテラルの組み合わせでは機能しますが、複数の文字列リテラルを連結しようとすると疑問が生じます。

問題の理解

次の例を考えてみましょう。

const string hello = "Hello";
const string message = hello + ",world" + "!";

このコードは、「,world」と「!」が存在するにもかかわらず、正常に実行されます。文字列リテラルとして。ただし、次の場合は同様の試みが失敗します。

const string exclam = "!";
const string message = "Hello" + ",world" + exclam;

The Associativity Factor

違いは、" " 演算子の結合性にあります。左から右に評価されます。つまり、

(hello + ",world") + "!"

最初のケースでは、「hello」が「,world」と連結され、文字列オブジェクトになります。次に、このオブジェクトは「!」と連結されます。

2 番目のケースでは、2 つの文字列リテラルの連結に対する制限により、「Hello」と「,world」を直接連結できません。これによりコンパイラ エラーが発生します。

考えられる解決策

この問題を解決するには、" " の最初の 2 つのオペランドが文字列オブジェクトであることを確認するか、強制的に括弧を使用した評価順序:

オプション 1: 最初のオペランドとしての文字列オブジェクト

const string message = string("Hello") + ",world" + exclam;

オプション 2: 括弧

const string message = "Hello" + (",world" + exclam);

文字列リテラルを直接連結できない理由

文字列リテラルは文字の配列であり、式で使用すると、その最初の要素へのポインターに変換されます。 2 つの文字列リテラルを追加しようとすることは、2 つのポインターを追加することと同じであり、無効です。

文字列リテラルを連結するための代替手段

文字列リテラルは、配置するだけで連結できます。互いに隣接する:

"Hello" ",world"

これは次と同等です:

"Hello,world"

ただし、このアプローチは文字列リテラルでのみ機能し、文字列オブジェクトや文字配列では機能しません。

以上がC で文字列リテラルを \" \" と連結する場合、直接結合できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。