这是 - >>一个旧操作员或错字/错误?

时间:2012-10-24 13:26:04

标签: c++ c operators history

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

起初我认为这是一个拼写错误,但它在文本中再复制了两次,而在代码示例中再次复制了问题,我很难相信它刚刚滑过至少两个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: "-->"?问题一样令人怀疑,但我不认为这是其他两个操作符的组合,我不知道它是如何划分并且有效的。

3 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:23)

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

从上下文p->>x[5]中,我们可以推断它似乎与更熟悉的箭头运算符->完全相同。因此可能是一个错字。


或者,将代码转换为HTML可能是一个编码问题。如果您查看该页面的来源,您会发现它有一个奇怪的转义代码和文字<>字符:

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

答案 2 :(得分:1)

这似乎可能是一个转录错误,但我认为写出一个真正的C编译器如何解释这个结构是有用的,无论如何,只是为了弄清楚它不是一个聪明的技巧。首先要知道的是这句话,来自C11§6.5.4p4(技术上,N1570;这个语言自C89以来没有变化,虽然章节数可能不同;强调我的):

  

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

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

接下来要知道的是,根据 postfix-expression x++ + ++y运算符的右手参数必须是标识符 >§6.5.2。显然->不是标识符,因此我们有明确的语法错误。