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 的早期版本中不再使用的某个运算符?

这感觉很可疑,这个运算符的名称是什么:“-->”?问题,但我认为这不是其他两个运算符的组合,我看不出它如何划分并有效。

4

3 回答 3

29

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

于 2012-10-24T14:26:07.907 回答
23

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

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


或者,这可能是将代码转录为 HTML 时的编码问题。如果您查看该页面的源代码,您会发现它有转义码、文字<>字符的奇怪混合:

<TT><B>#include &lt;stdlib.h><BR>
于 2012-10-24T13:29:42.797 回答
1

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

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

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

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

于 2014-02-14T23:25:16.863 回答