1

短い文字列を出力するために、次のようなコードがあります。

#include <iostream>
#include <string>

int main(int argc, const char* argv[])
{
  std::string s = "finished??/not finished??";
  std::cout << s << std::endl;
  return 0;
}

しかし、出力は 2 行にわたって表示され、一部の文字が失われています。

finished  
ot finished??

でも/n改行文字じゃないですか!何が起こっていますか?

4

2 に答える 2

4

翻訳の第 1 段階 ( ISO/IEC 14882:2011(E)の §2.2/1 ) では、トリグラフ シーケンスと呼ばれる一連の文字が単一の文字に置き換えられます。

Trigraph シーケンス (2.4) は、対応する単一文字の内部表現に置き換えられます。

トライグラフの 1 つが にマップ??/され\ます。最初のフェーズの後、コードは次のようになります。

#include <iostream>
#include <string>

int main(int argc, const char* argv[])
{
  std::string s = "finished\not finished??";
  std::cout << s << std::endl;
  return 0;
}

前処理フェーズの結果として、改行文字を表すエスケープ シーケンスを含む文字列リテラル"finished\not finished??"として解析されます。したがって、出力される文字列は次のようになります。\nfinished<NL>ot finished??

これを回避するには、疑問符の 1 つを としてエスケープする必要があります\?。これにより、以下が得られます。

#include <iostream>
#include <string>

int main(int argc, const char* argv[])
{
  std::string s = "finished?\?/not finished??";
  std::cout << s << std::endl;
  return 0;
}

??/これにより、トリグラフとして取り上げられることを回避できます。

于 2012-10-03T16:30:31.073 に答える
0

gcc 4.1.2 では、次の警告が表示されます。

cd /devserv-home/rspikol/ g++ -g -o tz tz.C tz.C:6:28: 警告: トライグラフ ??/ 無視、-trigraphs を使用して有効化

コンパイルは 10 月 3 日水曜日 12:43:16 に終了しました

そのため、デフォルトでは、このバージョンの gcc は C++ 標準に準拠していません。

@sftrabbit: C++ 標準の私のコピーでは、段落は 2.3/1 です

于 2012-10-03T16:48:15.203 に答える