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

Susan Sarandon
リリース: 2024-10-24 08:45:02
オリジナル
261 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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