在我阅读的过程中,我在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: "-->"?问题一样令人怀疑,但我不认为这是其他两个操作符的组合,我不知道它是如何划分并且有效的。
答案 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 <stdlib.h><BR>
答案 2 :(得分:1)
这似乎可能是一个转录错误,但我认为写出一个真正的C编译器如何解释这个结构是有用的,无论如何,只是为了弄清楚它不是一个聪明的技巧。首先要知道的是这句话,来自C11§6.5.4p4(技术上,N1570;这个语言自C89以来没有变化,虽然章节数可能不同;强调我的):
如果输入流已被解析为预处理令牌,直到给定的字符,那么 下一个预处理令牌是最长的字符序列,可以构成一个 预处理令牌。
这意味着必须将六个字符的字符串" p->>x"
标记为p -> > x
,而不是p - >> x
或p - > > x
。 (在这种情况下实际上并不重要,无论哪种方式都会出现语法错误,但此规则可以是程序解析与预期之间的区别,而不是;标准给出了示例{ {1}},被解释为x+++++y
,而不是x++ ++ +y
,即使只有后者是格式良好的表达式。)
接下来要知道的是,根据 postfix-expression x++ + ++y运算符的右手参数必须是标识符 >§6.5.2。显然->
不是标识符,因此我们有明确的语法错误。