Что _did_ операторы C /\ и \/ делают?

Любой может "объявить" свои собственные операторы в C.... это если вы гуру компилятора C и имеете исходный код для компилятора C!;-)

Дополнительные вопросы к головоломке:

  1. Как эти операции выполняются в C99? НКУ? ...
  2. И почему /\ & \/ упали?
  3. Для каких типов действовали операторы / \ и \ /?

Поиск в Google для "/\ \/", естественно, ничего не возвращает. В Википедии нет страницы ни для \ \, ни для \ /. Но я заметил, что подобные операторы встроены в символьные объекты XML!


Источник добавлен: я нашел пример оскорбления в исходном файле cc PDP "c00.c":

/*
 * Return the next symbol from the input.
 * peeksym is a pushed-back symbol, peekc is a pushed-back
 * character (after peeksym).
 * mosflg means that the next symbol, if an identifier,
 * is a member of structure or a structure tag or an enum tag
 */
symbol()
{
...
 case BSLASH:
  if (subseq('/', 0, 1))
   return(MAX);
  goto unkn;

 case DIVIDE:
  if (subseq('\\', 0, 1))
   return(MIN);
  if (subseq('*',1,0))
   return(DIVIDE);
...
}


Фактические реализации: операторы / \ и \ / датируются шестым выпуском Unix 1975 (до сих пор). Примеры: Unix V6 (1975), Unix V7 (1979) и более в настоящее время BSD 2.11 (1992-2008)

8 ответов

Решение

\/ похоже sup а также /\ похоже inf, Они также могут быть и соответственно.

Я не помню, чтобы когда-либо видел их в K&R 2nd edition или любой другой книге C.

Ни \ / ни / не определены как операторы в стандарте ISO C89, и я не думаю, что они когда-либо были определены в какой-либо более ранней версии. И они точно не определены в C99, насколько я знаю.

Вот пример стандарта ANSI C89 для справки: http://flash-gordon.me.uk/ansi.c.txt

(Вы, вероятно, жертва какой-то странной тайной магии препроцессора)

Спекуляция!

Если у вас есть пробелы вокруг них, то:

a /\ b   ===>   a / b

a \/ b   ===>   a / b

Логика: фаза предварительной обработки имеет дело с обратной косой чертой и символом после, и вполне вероятно, что обратная косая черта будет рассматриваться как пробел, а обратная косая черта - как косая черта.

Тем не менее, как компилятор SUN C (версия 12), так и компилятор GNU C (версия 4.4) отклоняют код, содержащий обратную косую черту. Но я мог легко поверить, что старые, предварительно стандартные препроцессоры C были менее осторожны с этим.

Соответствие стандартам

Операторы никогда не были частью официальной версии C.

Кроме того, стандарт не позволяет интерпретацию, которую я дал (раздел 5.1.1.2 Фазы перевода, как в C89, так и в C99) - но нестандартные компиляторы, конечно, не ограничены стандартом.


Добавлено после публикации источника:

Интересно! Так что это выглядит правдоподобно дляa = b /\ c;"назначить максимум b и c на a, и"a = b \/ c;"сделать минимум (или, как отметил Грег Хьюгилл, более вероятно, наоборот). И в те дни было вероятно, что современные+=операторы все еще были написаны как=+" и были на самом деле два токена (нет подтверждающих доказательств для этого утверждения; снова провал памяти), поэтому гипотетический"a =/\ b;' (или, в современных обозначениях,'a /\= b;') был бы оператором максимального назначения и т. д.

Мне также приходит в голову, что выступление Томпсона в премии ACM Turing Award " Размышления о доверии к доверию" как-то актуально.

Я не уверен насчет \/, но /\ является действительной конструкцией. Он используется для размещения двух слешей однострочного комментария на отдельных строках. Например:

/\
/ Comment content

Это работает, потому что символ обратной косой черты экранирует символ новой строки, а синтаксический анализатор продолжает работу, как если бы его там не было. Это не будет работать, если после обратной косой черты есть пробел или если вторая косая черта имеет отступ. Из-за этого можно избежать столько строк, сколько вам нужно, как в

/\
\
\
\
\
/ Still a legal comment.

Обратная косая черта может также использоваться в конце обычных однострочных комментариев, чтобы они продолжались до следующей строки, как в

// Yet another comment \
This line is in the comment \\
And so is this one!

Я сомневаюсь, что они когда-либо имели в виду. Если они когда-либо сделали, это было давно. Единственные известные мне основные операторы, которые были удалены из C, были =+ и =-, которые были ранними синонимами для += и -=. Возможно, вы захотите взглянуть на Primeal C Page DMR для доказательства.

Я предполагаю, что это ссылка на формальную символическую логику:

http://en.wikipedia.org/wiki/Table_of_logic_symbols

/ используется для обозначения дизъюнкции (ИЛИ) /\ используется (реже) для обозначения конъюнкции (И)

С никогда не было этих операторов.

Обычно в некоторых строковых системах / будет escape-кодом, не уверенным, что /\ когда-либо имел какое-либо значение.

Карета (^) выполняет побитовое исключение или.

Я не верю, что есть оператор "V". Это буква "V" (или что-то похожее на это). Кто-то может захотеть назвать переменную это.

Другие вопросы по тегам