#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
。この動作は、言語の文法が原因で単純に可能ですか、それとも問題の解決に役立つように追加された例外ですか?
隣接する文字列リテラルは連結されています。これは、ドラフト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]
コメントを追加