文字列リテラルの連結
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 サイトの他の関連記事を参照してください。