Koenig は、著書『Accelerated C』の中で、' ' 演算子を使用して文字列を連結する概念を紹介しています。リテラルとオブジェクト。これは簡単そうに見えますが、予期せぬ結果につながる可能性のある微妙なニュアンスがあります。
次の 2 つの例を考えてみましょう:
const string hello = "Hello";
const string message = hello ",world" "!";
const string exclam = "!";
const string message = "Hello" ",world" exclam;
最初の例では、3 つの文字列が正常に連結されています。ただし、2 番目の例は失敗します。
矛盾を理解するには、' ' 演算子の結合性を考慮する必要があります。 ' ' 演算子は左から右の結合であり、左から右に評価されることを意味します。これを考慮しないと、予期しない動作が発生する可能性があります。
2 番目の例では、式を次のように括弧で囲むことができます。
const string message = ("Hello" ",world") exclam;
ご覧のとおり、2 つの文字列リテラル、「Hello」と「,world」が最初に連結されます。この結果、文字列リテラルが生成され、これを文字列オブジェクト "exclam" とさらに連結することはできません。
この問題を解決するには、いくつかの方法があります。
const string message = string("Hello") ",world" exclam;
const string message = "Hello" (",world" exclam);
「 」演算子は、文字列リテラルではなく、文字列オブジェクトを連結するように設計されています。文字列リテラルは文字の配列であり、式で使用すると、その最初の要素へのポインターに変換されます。文字列リテラルを連結する場合のように、2 つのポインターを追加することは、C では許可されていません。
' ' 演算子を使用して文字列リテラルを連結することはできませんが、次のことはできます。並べて配置して結合します:
"Hello" ",world"
これは次と同等です:
"Hello,world"
これは、長い文字列リテラルを複数の行に分割する場合に便利です。
]免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3