【问题标题】:Is this ->> an old operator or a typo/error?这是 ->> 一个旧的运算符还是一个错字/错误?
【发布时间】:2012-10-14 13:16:41
【问题描述】:

在阅读过程中,我遇到了写于 1993 年(或者可能是 1893 年,他们离开了世纪和千年)的WG14 Defect Report #51。在那里的代码示例中,显然拼写为->> 的运算符用于指向struct 的指针。我在我找到的任何运算符优先级表中都找不到它,所以我想知道,它是否曾经是运算符,如果是,这个运算符是做什么的(或做了什么,视情况而定)?

起初我以为这是一个错字,但它在文本中又被复制了两次,在对问题的响应中又在代码示例中被复制了一次,我很难相信它只是滑过了至少两个 C专家不被注意,当它跳出来在像我这样的新手。它也是代码的焦点,很容易注意到,并且从未被纠正过。

这是添加了缩进的代码:

#include <stdlib.h>

struct A {
    char x[1];
};

main()
{
    struct A *p = (struct A *) malloc(sizeof(struct A) + 100);
    p->>x[5] = '?';  /* This is the key line [for both them and us] */
    return 0;
}

我尝试使用 C 和 C++ 编译器编译此代码,但在任一编译器中都无法解析。也许这是 C 早期版本中不再使用的某个运算符?

这感觉有点像What is the name of this operator: "-->"?的问题,但我不认为这是其他两个运算符的组合,我看不出它如何划分并有效。

【问题讨论】:

  • 我有一种错字的感觉。
  • @SethCarnegie:我同意这很难相信,但我发现这比 1993 年 C 有一个 -&gt;&gt; 运算符更容易相信,因为它被历史学家迷失了。 Andrew Koenig 是一位不朽的人,他在 1893 年还活着并评论了 C 标准,介于两者之间。也许他有一个曾祖父? ;-)
  • 简单地说,这段代码是2093年写的,所以operator-&gt;&gt;还没有发明出来。
  • 我们应该问this SO post的作者,因为他使用-&gt;&gt; :)
  • “一旦你消除了不可能,剩下的无论多么不可能,都必须是事实。” ——阿瑟·柯南·道尔

标签: c++ c operators history


【解决方案1】:

我在 1992 年学习 C,我 100% 确定当时没有这样的运算符。

根据上下文p-&gt;&gt;x[5],我们可以推断它似乎与更熟悉的箭头运算符-&gt; 做同样的事情。因此很可能是一个错字。


或者,在将代码转录为 HTML 时可能存在编码问题。如果您查看该页面的源代码,您会发现它有一个奇怪的转义码和文字 &lt;&gt; 字符混合:

<TT><B>#include &lt;stdlib.h><BR>

【讨论】:

  • 怀疑,见my comment
  • 更新了另一种可能的解释。
  • 这更有可能。但是没有理由对 > 字符进行编码,也没有匹配的 <.>
  • 在 1993 年,HTML 编码脚本很可能已经很糟糕了。
  • 如果是编码问题,为什么include中的&gt;没有坏掉?
【解决方案2】:

在转录过程中似乎存在问题。 DR 42 中也有类似的问题,大于号加倍:http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_042.html

【讨论】:

    【解决方案3】:

    这似乎确实是一个转录错误,但我认为写出一个真正的 C 编译器如何解释这个结构会很有用,无论如何,只是为了明确这不是一个聪明的把戏。首先重要的是要知道这句话,来自 C11 §6.5.4p4(技术上,N1570;这种语言自 C89 以来没有变化,尽管节号可能不同;强调我的):

    如果输入流已被解析为预处理标记,直到给定字符,则 下一个预处理标记是最长的字符序列,可以构成一个 预处理令牌。

    这意味着六个字符的字符串" p-&gt;&gt;x" 必须标记为p -&gt; &gt; x,而不是p - &gt;&gt; xp - &gt; &gt; x。 (在这种情况下实际上并不重要,无论哪种方式都将是语法错误,但是此规则 可以 是程序按预期解析与否之间的区别;标准给出了示例 @ 987654325@,它被解释为x++ ++ +y,而不是x++ + ++y,尽管只有后者是一个格式良好的表达式。)

    接下来要知道的是,-&gt; 运算符的右侧参数必须是 标识符,根据 postfix-expression 的语法规则§6.5.2。显然&gt; 不是标识符,所以我们有一个明确的语法错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多