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  
ot finished??

/n不是换行符吗!发生了什么?

4

2 回答 2

4

在翻译的第一阶段(ISO/IEC 14882:2011(E)的第 2.2/1 节),称为三字符序列的字符序列被替换为单个字符。

三字母序列 (2.4) 被相应的单字符内部表示代替。

三元组之一映射??/\。第一阶段之后,代码等价于:

#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??"被解析为包含转义序列的字符串文字\n,该转义序列表示换行符。因此,输出的字符串是:finished<NL>ot finished??

为避免这种情况,您需要将其中一个问号转义为\?. 这给了你:

#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: 警告:trigraph ??/ 已忽略,使用 -trigraphs 启用

编译于 10 月 3 日星期三 12:43:16 完成

因此,默认情况下,此版本的 gcc 不符合 C++ 标准。

@sftrabbit:在我的 C++ 标准副本中,该段落是 2.3/1

于 2012-10-03T16:48:15.203 回答