複数の文字列リテラルを使用して文字列を作成できるのはなぜですか?

トレバーヒッキー
#include <iostream>
#include <string>

int main() {
    std::string str = "hello " "world" "!";
    std::cout << str;
}

以下は、コンパイル、実行、および出力です。

こんにちは世界!

ライブを見る


文字列リテラルが連結されているように見えますが、興味深いことに、これは次の方法では実行できませんoperator +

#include <iostream>
#include <string>

int main() {
    std::string str = "hello " + "world";
    std::cout << str;
}

これはコンパイルに失敗します。
ライブを見る


この言語での動作はなぜですか?私の理論では、ステートメントは独自の行にある必要がある#includeため、複数のステートメントで文字列を作成できます#includeこの動作は、言語の文法が原因で単純に可能ですか、それとも問題の解決に役立つように追加された例外ですか?

Shafik Yaghmour

隣接する文字列リテラルは連結されています。これは、ドラフトC ++標準セクション2.2 の翻訳のフェーズパラグラフ6で確認できます。

隣接する文字列リテラルトークンは連結されます

他のケースでは、2つの* const char **を取るように定義されたoperator +はありません

理由については、これはCからのものであり、国際標準理論的根拠-プログラミング言語-Cに進むことができ、セクション6.4.5 文字列リテラルで次のように述べています

文字列は、円記号と改行の行の継続を使用して複数の行にまたがって継続できますが、これには、文字列の継続が次の行の最初の位置から開始する必要があります。より柔軟なレイアウトを可能にし、いくつかの前処理の問題を解決するために(§6.10.3を参照)、C89委員会は文字列リテラルの連結を導入しました。行の2つの文字列リテラルが一緒に貼り付けられ、中央にnull文字がないため、1つの結合された文字列リテラルが作成されます。このC言語への追加により、プログラマーは、バックスラッシュと改行のメカニズムを使用せずに、物理行の終わりを超えて文字列リテラルを拡張し、それによってプログラムのインデントスキームを破壊することができます。連結は実行時操作ではなく字句構造であるため、明示的な連結演算子は導入されませんでした。

この機能がないと、文字列リテラルを複数行にわたって継続するためにこれを行う必要があります。

   std::string str = "hello \
world\
!";

これはかなり醜いです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

リテラル文字を使用してClojure文字列を作成するのはなぜですか?

分類Dev

テンプレートリテラルを使用してJavaScriptで複数行の文字列を作成する

分類Dev

Swiftでオプションの変数を使用して複数行の文字列リテラルを分割するにはどうすればよいですか?

分類Dev

Rustで文字列リテラル&strではなく&strを使用するのはなぜですか?

分類Dev

const文字列変数を作成するときにString.Emptyを使用できないのはなぜですか?

分類Dev

文字列リテラルでconstchar *を返す関数が機能するのはなぜですか?

分類Dev

DISTINCTがリテラル文字列の大文字と小文字を変更するのはなぜですか

分類Dev

Erlang文字列をetsテーブル名として使用できないのはなぜですか?

分類Dev

文字列リテラルを使用してunsignedchar配列を初期化しても、unsigned charポインターを初期化しないのはなぜですか?

分類Dev

リテラル演算子テンプレート:文字列を使用しないのはなぜですか?

分類Dev

配列に複数の文字を割り当てることができないのはなぜですか?

分類Dev

どのように私は、MySQLで文字列リテラルを使用して文字列内の括弧を含めることができますか?

分類Dev

新しいVisualStudioが文字列リテラルを定数へのポインターとして使用するのはなぜですか?

分類Dev

Swiftの文字列コンストラクターを使用してジェネリックを文字列に変換できないのはなぜですか?

分類Dev

ラムダ関数/式の出力を文字列、リスト、またはタプルとして直接出力できないのはなぜですか?

分類Dev

文字列パラメータへのconst参照が文字列リテラルを取得できるのはなぜですか?

分類Dev

長さが配列自体よりも短い文字列リテラルを割り当てることができるのはなぜですか?

分類Dev

この文字列をリテラルに変換できないのはなぜですか?

分類Dev

clangが文字列リテラルを配列ではなくポインタとして受け取るのはなぜですか?

分類Dev

std :: vectorの文字列リテラル初期化子リストでC ++でstd :: vector <std :: string>を作成できないのはなぜですか?

分類Dev

文字列リテラルのdecltypeが配列型を生成しないのはなぜですか?

分類Dev

Ncurses-関数呼び出しに複数の引数が存在するのに、mvprintw()を使用して文字列を出力しないのはなぜですか?

分類Dev

文字列リテラルが文字列ではないのはなぜですか?

分類Dev

なぜJVMは文字列プールメモリ内の重複する文字列値を「認識」していないのですか?

分類Dev

クラスのコピー初期化が文字列リテラルを使用するstring_viewで機能しないのはなぜですか?

分類Dev

文字列リテラルを__FUNCTION__に連結できないのはなぜですか?

分類Dev

複数のランダムな文字列を生成できないのはなぜですか?

分類Dev

init(contentsOfFile :)を使用して文字列を作成するときに、余分な改行文字があるのはなぜですか?

分類Dev

coutを使用してC ++で文字列値の配列を出力できないのはなぜですか?

Related 関連記事

  1. 1

    リテラル文字を使用してClojure文字列を作成するのはなぜですか?

  2. 2

    テンプレートリテラルを使用してJavaScriptで複数行の文字列を作成する

  3. 3

    Swiftでオプションの変数を使用して複数行の文字列リテラルを分割するにはどうすればよいですか?

  4. 4

    Rustで文字列リテラル&strではなく&strを使用するのはなぜですか?

  5. 5

    const文字列変数を作成するときにString.Emptyを使用できないのはなぜですか?

  6. 6

    文字列リテラルでconstchar *を返す関数が機能するのはなぜですか?

  7. 7

    DISTINCTがリテラル文字列の大文字と小文字を変更するのはなぜですか

  8. 8

    Erlang文字列をetsテーブル名として使用できないのはなぜですか?

  9. 9

    文字列リテラルを使用してunsignedchar配列を初期化しても、unsigned charポインターを初期化しないのはなぜですか?

  10. 10

    リテラル演算子テンプレート:文字列を使用しないのはなぜですか?

  11. 11

    配列に複数の文字を割り当てることができないのはなぜですか?

  12. 12

    どのように私は、MySQLで文字列リテラルを使用して文字列内の括弧を含めることができますか?

  13. 13

    新しいVisualStudioが文字列リテラルを定数へのポインターとして使用するのはなぜですか?

  14. 14

    Swiftの文字列コンストラクターを使用してジェネリックを文字列に変換できないのはなぜですか?

  15. 15

    ラムダ関数/式の出力を文字列、リスト、またはタプルとして直接出力できないのはなぜですか?

  16. 16

    文字列パラメータへのconst参照が文字列リテラルを取得できるのはなぜですか?

  17. 17

    長さが配列自体よりも短い文字列リテラルを割り当てることができるのはなぜですか?

  18. 18

    この文字列をリテラルに変換できないのはなぜですか?

  19. 19

    clangが文字列リテラルを配列ではなくポインタとして受け取るのはなぜですか?

  20. 20

    std :: vectorの文字列リテラル初期化子リストでC ++でstd :: vector <std :: string>を作成できないのはなぜですか?

  21. 21

    文字列リテラルのdecltypeが配列型を生成しないのはなぜですか?

  22. 22

    Ncurses-関数呼び出しに複数の引数が存在するのに、mvprintw()を使用して文字列を出力しないのはなぜですか?

  23. 23

    文字列リテラルが文字列ではないのはなぜですか?

  24. 24

    なぜJVMは文字列プールメモリ内の重複する文字列値を「認識」していないのですか?

  25. 25

    クラスのコピー初期化が文字列リテラルを使用するstring_viewで機能しないのはなぜですか?

  26. 26

    文字列リテラルを__FUNCTION__に連結できないのはなぜですか?

  27. 27

    複数のランダムな文字列を生成できないのはなぜですか?

  28. 28

    init(contentsOfFile :)を使用して文字列を作成するときに、余分な改行文字があるのはなぜですか?

  29. 29

    coutを使用してC ++で文字列値の配列を出力できないのはなぜですか?

ホットタグ

アーカイブ