【问题标题】:Incrementing reference variable doesn't work [duplicate]递增参考变量不起作用[重复]
【发布时间】:2013-06-30 20:14:19
【问题描述】:

以下代码应该输出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;
}

Live demo

【问题讨论】:

  • @LightnessRacesinOrbit 如果你是already knew the answer,你为什么不回答你自己的问题?
  • 这基本上是漂亮的打印机语法荧光笔的美化错误报告......? (不确定是 +1 还是 -1。)
  • @LightnessRacesinOrbit:也许这应该被称为“自鸣得意的报告”。
  • 这个问题似乎是题外话,因为它只是一个笑话。见stackoverflow.com/revisions/…
  • @johnchen902:如果有人从中吸取教训,这不是开玩笑。事实上,我没有发布 A 并不会改变这一点。

标签: c++ c++11


【解决方案1】:

它是三合符。在c++11规范中

2.4 三元序列 [lex.trigraph]

1 在任何其他处理发生之前,每次出现以下三个字符序列之一 (“三字母序列”) 被替换为表 1 中所示的单个字符。

表 1 - 三元组序列 三字母替换│三字母替换│三字母替换 ──────────────────────┼──────────────────────┼────── ──────────────── ??= # │ ??( [ │ ?? } ??' ^ │ ??! | │ ??- ~

现在将??/ 替换为\,您会发现。

【讨论】:

    【解决方案2】:

    三合字母

    你正在使用 trigraphs 的好把戏。

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

    ??/ 三元组又被转换为\,它基本上将当前行与下一行连接起来,因此您的代码或多或少像这样:

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

    确实是个好技巧。


    引用 C++11 标准:

    §2.2.2:

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

    §2.4.1:

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

    幸运的是,GCC seems to detect this kind of trickery,发出警告(只需设置-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???/
        ^
    

    相关参考:

    meaning of `???-` in C++ code

    What is this smiley-with-beard expression: "<:]{%>"?

    What does the C ??!??! operator do?

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

    PS:那是笑脸。

    【讨论】:

    • 哦!多么有趣和简洁的功能。
    • @LightnessRacesinOrbit 有趣吗?是的!整洁的?不!有用?绝对不!他们什么时候最终会从标准中删除像那样的垃圾(连同逻辑运算符的文字版本)。向我展示一个现在需要这些知识的人不仅仅是“派对知识”(或者可能是假设的 IOC++CC 的条目)。
    • @ChristianRau 这是一些派对......
    • @LightnessRacesinOrbit 你说得好像你不知道很令人信服。我希望看到程序员在他们尚未测试的行之前写评论// Why won't this line work???/。那一定是个很悲观的人……
    【解决方案3】:

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

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

    【讨论】:

    • 哦!你说得对! (顺便说一句,99.9k .. 不错)
    • @LightnessRacesinOrbit:我们都知道你已经知道了,而你只是在拖钓 ;-) 啊,虽然已经显示 100k,但我错过了这一刻,并不是我在抱怨。
    • @AlokSave 恭喜您获得 100k RP
    • @GrijeshChauhan:谢谢 :)
    【解决方案4】:
    // Why won't this line work???/
       foo(x);
    

    三元组??/变成\,所以代码会被翻译成:

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

    字符串连接有效。

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

    【讨论】:

      【解决方案5】:

      编译器是你的朋友。这个

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

      是多行注释,foo(x) 没有被执行!

      trigraph "??/" 转换为 "\",表示注释中的换行符。

      【讨论】:

      • / 有什么作用?
      • 它在跟随 ?? 时转换为 \。 c 和 c++ 中使用的三元组可以在以下位置找到:en.wikipedia.org/wiki/Digraphs_and_trigraphs
      • @StefanoFalasca 你有一种奇怪而迂回的方式到达该点。你的解释是......有点误导。 '/' 不会转换为 '\\' 当它跟随任何东西时。 '??/' 被编译器看到,因为'\\' iff 三元组被启用。 (Urffff。F*cken 评论降价)
      • 实际上,trigraph ??/ 甚至没有到达编译器,替换是由预处理器完成的
      • @StefanoFalasca 正是我所说的。编译器看到一个'/'
      【解决方案6】:

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

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

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

      另见Purpose of Trigraph sequences in C++?

      【讨论】:

      • 好吧。是树还是图。嗯。有些图可以是森林……嗯。我迷路了
      • ehehe,只是把 tri 拼错为 tree。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多