В ходе моего чтения я наткнулся 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, который больше не используется?
Это подозрительно похоже на Как называется этот оператор: «->»? вопрос, но я не думаю, что это комбинация двух других операторов, я не понимаю, как это можно разделить и быть действительными.
Похоже, проблема в процессе транскрипции. Существует аналогичная проблема в 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.2. очевидно >
не является идентификатором, поэтому мы имеем определенную синтаксическую ошибку.