这是一个旧的操作符还是一个打字错误/错误?

50
在阅读中,我看到了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语言中不再使用的运算符?

这感觉很像这个运算符的名称是什么:“-->”?问题,但我不认为这是两个其他运算符的组合,我不知道它如何被分割并成为有效的。


16
我有一种感觉这是打字错误。 - R. Martinho Fernandes
4
我同意很难相信,但我认为这比如今早在1993年C语言曾经有一个->>运算符更容易相信,而该运算符如今已被历史学家所遗忘。安德鲁·科尼格(Andrew Koenig)在1893年仍然活着并对C语言标准进行评论,这种说法介于两者之间。也许他有一个曾祖父?;-) - Steve Jessop
41
简单地说,这段代码是在2093年编写的,因此operator->>还没有被发明。 - Lol4t0
3
他使用了 ->>,所以我们应该向 这篇 Stack Overflow 帖子 的作者询问。 - halex
6
"一旦你排除了不可能的,剩下的无论多么不可思议,必定是真相。" - 阿瑟·柯南·道尔 - Adam Rosenfield
显示剩余23条评论
3个回答

29

23

我在1992年学习了C语言,百分之百确定当时没有这个运算符。

从上下文中可以推断出p->>x[5]的作用与更常见的箭头运算符->完全相同,因此很可能是笔误。


或者,它可能是将代码转录为HTML时的编码问题。如果您查看该页面的源代码,您会看到它具有一种奇怪的转义代码和字面上的<>字符的混合:

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

怀疑的话,可以看看我的评论 - Seth Carnegie
更新了另一个可能的解释。 - Graham Borland
这是完全有可能的。但是没有理由编码>字符,也没有匹配的<。 - Seth Carnegie
1
1993年,HTML编码脚本很可能非常不完整。 - Graham Borland
4
如果这是编码问题,为什么include中的>没有出错? - Lol4t0
@Lol4t0:严格来说,是的。但由于没有标签可以将 > 作为其一部分,因此没有歧义,因此您的浏览器将按原样呈现它。 - Lightness Races in Orbit

1
这似乎很可能是一种转录错误,但我认为写出实际的C编译器如何解释这个结构会很有用,以便明确它不是一个聪明的技巧。首先需要知道的是这句话,来自C11 §6.5.4p4(技术上是N1570;这种语言自C89以来没有改变,尽管部分编号可能不同;强调我的):

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

这意味着六个字符的字符串" p->>x"必须被分解为p -> > x,而不是p - >> xp - > > x。(实际上在这种情况下并不重要,因为无论哪种方式都是语法错误,但这个规则可以是程序按预期解析和不解析的区别;标准给出了一个例子x+++++y,它被解释为x++ ++ +y,而不是x++ + ++y,尽管只有后者是一个良好形式的表达式。)
接下来需要知道的是,->运算符的右侧参数必须是一个标识符,根据§6.5.2中后缀表达式的语法规则。显然,>不是一个标识符,所以我们有一个明显的语法错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接