2012-10-03 51 views
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不是新行字符!发生了什么?

+0

@ahenderson - '/ n' 为不是一个新行字符。

回答

4

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

Trigraph序列(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; 
} 

这样就避免了??/被三角图拾取。

0

在GCC 4.1.2我得到这样的警告:

CD/devserv家庭/ rspikol/ G ++ -g -o TZ tz.C tz.C:6:28:警告:三字母? /忽略,使用-trigraphs使

编辑在周三结束十月3十二时43分16秒

所以,在默认情况下,这个版本的GCC是不是C++标准兼容。

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