这是 – “一个旧的操作员或错字/错误?

在阅读过程中,我遇到了1993年(也就是1893年,他们离开了世纪和千禧年)编写的WG14缺陷报告#51 。 在代码示例中,显然是一个运算符spelled ->>用于指向struct的指针。 我无法在我find的任何运算符优先级表中find它,所以我想知道,是或曾经是运算符,如果是,那么这个运算符做了什么(或者做了什么)?

起初我以为这是一个错字,但是它在文本中又被重复了两次,而在另一次代码样本中又回复了这个问题,我很难相信它刚刚从至less两个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 ++编译器来编译这段代码,但是在任何一个编译器中都没有parsing。 也许这是C语言早期版本中的一些运算符,不再使用?

这感觉像这个运算符的名字是什么:“ – >”? 问题,但我不认为这是其他两个运营商的组合,我不明白它是如何分解和有效的。

这在转录过程中看起来像一个问题。 在DR42中也有一个类似的问题,大于号是加倍: http : //www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_042.html

我在1992年学过C,而且我100%肯定当时没有这样的操作员。

从上下文中, p->>x[5] ,我们可以推断它看起来和更常见的箭头运算符->完全相同。 因此可能是一个错字。


或者,它可能是将代码转换为HTML的编码问题。 如果你看看这个页面的源代码,你可以看到它有一个奇怪的混合转义代码和文字<>字符:

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

这似乎可能是一个转录错误,但我认为写一个真正的C编译器如何解释这个构造是有用的,无论如何,只是为了弄清楚它不是一个聪明的把戏。 首先要了解的是C11第6.5.4p4节(技术上,N1570;自C89以来,这种语言没有改变,尽pipe节号可能不同;重点是我的):

如果inputstream已经被parsing成预处理标记直到给定字符,则下一个预处理标记是可以构成预处理标记的最长字符序列。

这意味着六个字符的string" p->>x"必须标记为p -> > x ,而不是p - >> xp - > > x 。 (在这种情况下实际上并不重要,这两种方法都是语法错误,但是这个规则可以是程序parsing之间的区别,而不是这个规则;标准给出了x+++++y的例子,它被解释为x++ ++ +y ,而不是x++ + ++y ,尽pipe只有后者是一个格式良好的expression式。

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