Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是->&燃气轮机;是老操作员还是打字错误?_C++_C_Operators_History - Fatal编程技术网

C++ 这是->&燃气轮机;是老操作员还是打字错误?

C++ 这是->&燃气轮机;是老操作员还是打字错误?,c++,c,operators,history,C++,C,Operators,History,在我阅读的过程中,我读到了1993年写的一本书(或者1893年,他们省略了世纪和千年)。在那里的代码示例中,显然在指向结构的指针上使用了拼写为->的运算符。我在我找到的任何操作符优先级表中都找不到它,所以我想知道,它是否是一个操作符,如果是,这个操作符做了什么(或者做了什么,视情况而定) 起初我认为这是一个打字错误,但在文本中又重复了两次,在回答问题的代码示例中又重复了一次,我很难相信它只是从至少两位C专家身边溜走而没有被注意到,当它跳到像我这样的新手身上时。它也是代码的焦点,很容易被注意到,而

在我阅读的过程中,我读到了1993年写的一本书(或者1893年,他们省略了世纪和千年)。在那里的代码示例中,显然在指向
结构的指针上使用了拼写为
->
的运算符。我在我找到的任何操作符优先级表中都找不到它,所以我想知道,它是否是一个操作符,如果是,这个操作符做了什么(或者做了什么,视情况而定)

起初我认为这是一个打字错误,但在文本中又重复了两次,在回答问题的代码示例中又重复了一次,我很难相信它只是从至少两位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;
}
#包括
结构A{
charx[1];
};
main()
{
结构A*p=(结构A*)malloc(sizeof(结构A)+100);
p->>x[5]='?';/*这是关键的一行[对他们和我们来说]*/
返回0;
}
我试图用C和C++编译器编译这个代码,但不能解析其中任何一个。也许这是C早期版本中不再使用的某个操作符


这个问题让人怀疑,但我不认为这是另外两个操作符的组合,我不知道它如何被划分和有效。

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

从上下文中,
p->>x[5]
,我们可以推断它似乎与更熟悉的箭头操作符,
->
做了完全相同的事情。因此很可能是打字错误


或者,在将代码转录成HTML时可能会出现编码问题。如果您查看该页面的源代码,您可以看到它包含了一个奇怪的转义码和文本
字符:

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

这似乎是转录过程中的一个问题。DR 42中也存在类似的问题,大于号加倍:

这似乎是一个转录错误,但我认为写出一个真正的C编译器如何解释这个构造是有用的,只是为了说明这不是一个聪明的技巧。首先要知道的是C11§6.5.4p4中的这句话(从技术上讲,N1570;该语言自C89以来没有变化,尽管章节号可能有所不同;重点是我的):

如果已将输入流解析为预处理标记(最多可达给定字符),则 下一个预处理标记是可能构成一个标记的最长字符序列 预处理令牌

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


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

我觉得这是一个输入错误。@SethCarnegie:我同意这很难相信,但我发现比这更容易相信,因为在1993年C有一个
->
操作符,因为它输给了历史学家。安德鲁·柯尼格(Andrew Koenig)是一位活着的不朽人物,他在1893年评论了C标准,这介于两者之间。也许他有一位曾祖父?;-)简单地说,这段代码是在2093年编写的,所以
操作符->
还没有发明。我们应该问作者,因为他使用
->
:)“一旦你消除了不可能,剩下的任何东西,无论多么不可能,都一定是事实。”-亚瑟·柯南·道尔对此表示怀疑,请参阅更新的另一个可能的解释。这是更可能的。但是没有理由对>字符进行编码,而且在1993年也没有匹配,HTML编码脚本很可能非常糟糕。如果是编码问题,为什么
include
中的
没有被破坏?