2012-10-03 77 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