1

次のプログラムの出力はなぜですか。

str                 str

これではありません:

str str

これはプログラムです:

#include <iostream>

int main()
{
   std::cout << "str \
                str \n";
}

gcc 4.7.2 と MSVC-11.0 の両方を試しました。

4

3 に答える 3

9

\改行の前は行継続を表すためです。* したがって、すべての空白を含めて、2 つの行が文字通りつなぎ合わされます。

代わりにこれを試すことができます:

std::cout << "str "
                "str \n";

隣接する文字列リテラルが連結されるためです。


* C99 のセクション 5.1.1.2 から:

\直後に改行文字が続く バックスラッシュ文字 ( ) の各インスタンスが削除され、物理ソース行が結合されて論理ソース行が形成されます。

于 2013-01-09T17:05:56.593 に答える
4

バックスラッシュはプリプロセッサによって次のルールで置き換えられます:\改行文字が続く各シーケンスは削除されます。

C11 (n1570)、§ 5.1.1.2 変換フェーズ
改行文字が直後に続く バックスラッシュ文字 ( \) の各インスタンスが削除され、物理ソース行が結合されて論理ソース行が形成されます。

一般的な解決策は、隣接する文字列リテラルの連結を使用することです。

std::cout << "str"
             "str\n";

C11 (n1570)、§ 5.1.1.2 翻訳フェーズ
隣接する文字列リテラル トークンは連結されます。

于 2013-01-09T17:06:15.010 に答える
3

改行の前のバックスラッシュは、文字列が次の行に続くことを示します。次の行の先頭に多くの空白文字があります。

試す:

std::cout << "str " 
                "str \n";
于 2013-01-09T17:07:01.130 に答える