次のプログラムの出力はなぜですか。
str str
これではありません:
str str
これはプログラムです:
#include <iostream>
int main()
{
std::cout << "str \
str \n";
}
gcc 4.7.2 と MSVC-11.0 の両方を試しました。
\
改行の前は行継続を表すためです。* したがって、すべての空白を含めて、2 つの行が文字通りつなぎ合わされます。
代わりにこれを試すことができます:
std::cout << "str "
"str \n";
隣接する文字列リテラルが連結されるためです。
\
直後に改行文字が続く バックスラッシュ文字 ( ) の各インスタンスが削除され、物理ソース行が結合されて論理ソース行が形成されます。
バックスラッシュはプリプロセッサによって次のルールで置き換えられます:\
改行文字が続く各シーケンスは削除されます。
C11 (n1570)、§ 5.1.1.2 変換フェーズ
改行文字が直後に続く バックスラッシュ文字 (\
) の各インスタンスが削除され、物理ソース行が結合されて論理ソース行が形成されます。
一般的な解決策は、隣接する文字列リテラルの連結を使用することです。
std::cout << "str"
"str\n";
C11 (n1570)、§ 5.1.1.2 翻訳フェーズ
隣接する文字列リテラル トークンは連結されます。
改行の前のバックスラッシュは、文字列が次の行に続くことを示します。次の行の先頭に多くの空白文字があります。
試す:
std::cout << "str "
"str \n";