Ответ 1
Это похоже на проблему в процессе транскрипции. Аналогичная проблема в DR 42, где знак больше, чем знак, удваивается: http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_042.html
Сначала я подумал, что это опечатка, но она повторяется дважды в тексте и в другой раз в примере кода в ответе на вопрос, и я с трудом верю, что он просто проскользнул, по крайней мере, на два 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, который больше не используется?
Это выглядит подозрительно, как Что такое имя этого оператора: "- > " ? вопрос, но я не думаю, что это комбинация двух другие операторы, я не вижу, как это можно разделить и быть действительным.
Это похоже на проблему в процессе транскрипции. Аналогичная проблема в DR 42, где знак больше, чем знак, удваивается: http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_042.html
Я узнал C в 1992 году, и я на 100% уверен, что такого оператора тогда не было.
Из контекста p->>x[5]
можно сделать вывод, что он, похоже, делает то же самое, что и более знакомый оператор стрелки ->
. Вероятно, это будет опечатка.
В качестве альтернативы, это может быть проблема с кодировкой при расшифровке кода в HTML. Если вы посмотрите на источник на эту страницу, вы увидите, что в нем появилась странная смесь escape-кодов и буквенных <
и >
символов:
<TT><B>#include <stdlib.h><BR>
Вероятно, это была ошибка транскрипции, но я думаю, было бы полезно написать, как настоящий C-компилятор интерпретирует эту конструкцию, так или иначе, просто чтобы понять, что это не хитроумный трюк. Первое, что важно знать, это предложение, из C11 §6.5.4p4 (технически, N1570, этот язык неизменен с C89, хотя номер раздела, вероятно, был другим, удар мой):
Если входной поток проанализирован в токере предварительной обработки до заданного символа, следующий токен предварительной обработки - это самая длинная последовательность символов, которая может составлять токен предварительной обработки.
Это означает, что шестисимвольная строка " p->>x"
должна быть обозначена как p -> > x
, а не p - >> x
или p - > > x
. (В этом случае это не имеет никакого значения, это будет синтаксическая ошибка в любом случае, но это правило может быть разницей между разбором программ, как и предполагалось, а не; в стандарте приведен пример x+++++y
, который интерпретируется как x++ ++ +y
, а не как x++ + ++y
, хотя только последнее является хорошо сформированным выражением.)
Следующее, что нужно знать, просто состоит в том, что правый аргумент оператора ->
должен быть идентификатором в соответствии с правилами грамматики постфикс-выражения в п. 6.5. Очевидно, что >
не является идентификатором, поэтому мы имеем определенную синтаксическую ошибку.