2

下面的代码应该输出6,但它却输出5。我不知道为什么。这是怎么回事?

#include <iostream>

template <typename T>
void foo(T& y)
{
   y++;
}

int main()
{
   int x = 5;

   // Why won't this line work???/
   foo(x);

   std::cout << x;
}

现场演示

4

6 回答 6

21

三元组

您正在使用trigraphs的好技巧。

// Why won't this line work???/
                            | |
                            \ /
                             |
                         ~trigraph~

??/trigraph 依次转换为基本上将\当前行与下一行连接起来,因此您的代码或多或少像这样:

// Why won't this line work? foo(x);

确实是个好技巧。


引用 C++11 标准:

§2.2.2:

每个反斜杠字符 (\) 的实例后面紧跟一个换行符被删除,拼接物理源代码行以形成逻辑源代码行。...

§2.4.1:

Table 1 - Trigraph sequences
...
==========================
| Trigraph | Replacement |
==========================
|          ...           |
==========================
|   ??/    |      \      |
==========================

幸运的是,GCC 似乎检测到了这种诡计,发出警告(只是设置-Wall):

main.cpp:13:32: warning: trigraph ??/ converted to \ [-Wtrigraphs]
    // Why won't this line work???/
 ^

main.cpp:13:4: warning: multi-line comment [-Wcomment]
    // Why won't this line work???/
    ^

相关参考:

`???-` 在 C++ 代码中的含义

这个带胡子的笑脸表情是什么:“<:]{%>”?

C ??!??! 是什么意思?运营商呢?

以及所有其他类似的问题。??)

PS:这是一个笑脸。

于 2013-07-03T08:18:42.103 回答
8

??/是一个被替换为的Trigraph 序列\
对于编译器来说\,紧随其后的行是当前行的一部分。在这种情况下,当前行是注释。有效的结果是:

// Why won't this line work foo(x);
于 2013-07-03T08:19:10.600 回答
4
于 2013-07-03T08:15:52.800 回答
2
// Why won't this line work???/
   foo(x);

三元组??/变为\,因此代码将被翻译为:

// Why won't this line work?\
   foo(x);

字符串连接有效。

当我在 g++ 中测试它时,trigraph 默认关闭(生成警告),它将输出 6。如果使用 编译g++ t.cpp -trigraphs,将输出 5。

于 2013-07-03T08:19:10.850 回答
2

可能您的评论被解释为“删除”函数调用的三元图(不是树形图!)。

http://ideone.com/sU4YGc为我在评论中删除 ??/ 工作。

// Why won't this line work?
foo(x);

另请参阅C++ 中 Trigraph 序列的用途?

于 2013-07-03T08:24:36.200 回答
1

编译器是你的朋友。这个

   // Why won't this line work???/
   foo(x);

是多行注释,不执行 foo(x) !

三元组“ ??/”转换为“\”,表示注释中的换行符。

于 2013-07-03T08:22:11.720 回答