Это — & gt; & gt; старый оператор или опечатка / ошибка?

В ходе моего чтения я наткнулся WG14 Отчет о дефектах # 51 написано в 1993 году (или, возможно, в 1893 году они закончили столетия и тысячелетия). В примере кода, видимо, оператор пишется ->> используется на указатель на struct, Я не могу найти его ни в одной из таблиц приоритетов операторов, которую я нашел, поэтому мне интересно, является ли это оператором или был ли он когда-либо, и если да, то что делает (или делал, в зависимости от обстоятельств) этот оператор?

Сначала я подумал, что это опечатка, но в тексте она повторяется дважды, а в ответ на вопрос — в другой раз, и мне трудно поверить, что она просто прошла мимо, по крайней мере, двух экспертов по Си, заметил, когда выскочил на новичка, как я. Он также находится в центре внимания кода, его очень легко заметить, и он никогда не исправлялся.

Вот код с добавленным отступом:

#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, который больше не используется?

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

50

Решение

Похоже, проблема в процессе транскрипции. Существует аналогичная проблема в DR 42, где знак больше чем удваивается: http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_042.html

29

Другие решения

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

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


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

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

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

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

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

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

1
По вопросам рекламы [email protected]