Подтвердить что ты не робот

Это - >> старый оператор или опечатка/ошибка?

В ходе моего чтения я пришел через отчет о дефектах №148 WG14, написанный в 1993 году (или, возможно, 1893 год, они прекратили свое существование и тысячелетия). В образце кода там, по-видимому, оператор, записанный ->>, используется для указателя на 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, который больше не используется?

Это выглядит подозрительно, как Что такое имя этого оператора: "- > " ? вопрос, но я не думаю, что это комбинация двух другие операторы, я не вижу, как это можно разделить и быть действительным.

4b9b3361

Ответ 2

Я узнал C в 1992 году, и я на 100% уверен, что такого оператора тогда не было.

Из контекста p->>x[5] можно сделать вывод, что он, похоже, делает то же самое, что и более знакомый оператор стрелки ->. Вероятно, это будет опечатка.


В качестве альтернативы, это может быть проблема с кодировкой при расшифровке кода в HTML. Если вы посмотрите на источник на эту страницу, вы увидите, что в нем появилась странная смесь escape-кодов и буквенных < и > символов:

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

Ответ 3

Вероятно, это была ошибка транскрипции, но я думаю, было бы полезно написать, как настоящий C-компилятор интерпретирует эту конструкцию, так или иначе, просто чтобы понять, что это не хитроумный трюк. Первое, что важно знать, это предложение, из C11 §6.5.4p4 (технически, N1570, этот язык неизменен с C89, хотя номер раздела, вероятно, был другим, удар мой):

Если входной поток проанализирован в токере предварительной обработки до заданного символа, следующий токен предварительной обработки - это самая длинная последовательность символов, которая может составлять токен предварительной обработки.

Это означает, что шестисимвольная строка " p->>x" должна быть обозначена как p -> > x, а не p - >> x или p - > > x. (В этом случае это не имеет никакого значения, это будет синтаксическая ошибка в любом случае, но это правило может быть разницей между разбором программ, как и предполагалось, а не; в стандарте приведен пример x+++++y, который интерпретируется как x++ ++ +y, а не как x++ + ++y, хотя только последнее является хорошо сформированным выражением.)

Следующее, что нужно знать, просто состоит в том, что правый аргумент оператора -> должен быть идентификатором в соответствии с правилами грамматики постфикс-выражения в п. 6.5. Очевидно, что > не является идентификатором, поэтому мы имеем определенную синтаксическую ошибку.