Что _did_ операторы C / \ и \ / делают? - PullRequest
34 голосов
/ 09 октября 2009

Любой может "объявить" свои собственные операторы в 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 ]

18 голосов
/ 09 октября 2009

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

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

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

14 голосов
/ 09 октября 2009

\/ выглядит как sup, а /\ выглядит как inf. Они также могут быть & # x2228; и & # x2227; соответственно.

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

10 голосов
/ 09 октября 2009

Спекуляции!

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

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 « Размышления о доверии к доверию » как-то актуальна.

6 голосов
/ 09 октября 2009

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

/\
/ Comment content

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

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

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

// Yet another comment \
This line is in the comment \\
And so is this one!
3 голосов
/ 09 октября 2009

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

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

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

3 голосов
/ 09 октября 2009

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

3 голосов
/ 09 октября 2009

C никогда не имел этих операторов.

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

1 голос
/ 09 октября 2009

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

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

...