2

“???” 如果我编译 mn VC++ 程序并运行它,则转换为 '^'

例如

sprintf( ch, "??") 

打印出来

^

但是如果我在 Turbo C/C++ 中运行相同的代码,就不存在这样的问题。为什么它发生在 Windows 上的 VC++ 上?

4

3 回答 3

4

你确定这是双引号而不是单引号?如果是 ??',那么您刚刚遇到了trigraph,这是一个确实应该删除的“功能”,但不是因为 IBM 没有从 EBCDIC 迁移到 UTF-8。(当 C++0x 仍然开放以进行更改时,Trigraphs 被考虑删除,但删除 trigraphs 的举动被 IBM 及其在 ISO C++ 委员会的代表强烈阻止)。

于 2010-04-15T03:57:05.823 回答
4

??单独不是三合词,虽然??'对应^

也许您在这里键入的内容与您在代码中的内容不同,并且您看不到字符串中的尾随单引号,因为它太接近结束引号。

所以在代码中你可能有:

sprintf( ch, "??'");
于 2010-04-15T03:57:43.523 回答
3

通常的??序列开始一个三元组,但序列“??” 不是三元组,因此不应将其解释为 - 编译器中可能存在错误 - 您使用的是哪个版本,确切的代码是什么(包括变量声明)?

此代码打印“??” 如您所料,在 MSVC 6 到 VS 2010 的多个版本中:

char ch[20];
sprintf( ch, "??");
printf( "%s\n", ch);

但是将snprintf()行替换为:

sprintf( ch, "'??'");

并且输出变为“ '^”(VS 2010 除外)。

快速测试显示 VS 2010 默认禁用三字符支持(它'??'在第二次测试中打印出“”)。在 VS 2010 中,您必须使用该/Zc:trigraphs选项显式启用三字符支持。好的。

有关什么是三元组的更多详细信息,请参阅:C++ 中三元组序列的用途?

于 2010-04-15T03:55:32.383 回答