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

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

Дополнительные вопросы для разгадки:

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

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


Источник добавлен: я нашел оскорбительный пример в исходном файле 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 )


person NevilleDNZ    schedule 08.10.2009    source источник
comment
Я ... не знаю, что эти пары символов когда-либо имели значение в C. почему вы думаете, что они имели значение?   -  person Brian Postow    schedule 09.10.2009
comment
Я не верю, что когда-либо видел этих операторов где-либо. Всегда.   -  person Nick Bedford    schedule 09.10.2009
comment
логические символы AND и OR ?   -  person Nick Dandoulakis    schedule 09.10.2009
comment
Где в коде вы это увидели? Не могли бы вы поделиться некоторыми строками?   -  person Dirk Vollmar    schedule 09.10.2009
comment
Интересный! Таким образом, 'a = b /\ c;' выглядит правдоподобно, чтобы присвоить a максимум b и c, а 'a = b \/ c;' - минимум. И в те дни вполне вероятно, что современные операторы «+=» все еще записывались как «=+» и на самом деле были двумя токенами, поэтому гипотетический «a =/\ b;» был бы оператором максимального присваивания и т. д. Заинтриговано!   -  person Jonathan Leffler    schedule 09.10.2009
comment
Мне также приходит в голову, что речь Томпсона на премии ACM Turing Award «Размышления о доверии к доверию» (ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf) как-то уместно.   -  person Jonathan Leffler    schedule 09.10.2009
comment
@Jonathan Leffler: без полного контекста кода трудно быть уверенным, но похоже, что \/ было MAX, а /\` was MIN`. Наверное, не то направление, которое я бы выбрал!   -  person Greg Hewgill    schedule 09.10.2009
comment
@ Грег - да ... я подозреваю, что ты прав. Может быть, именно поэтому он никогда не был стандартизирован?   -  person Jonathan Leffler    schedule 09.10.2009
comment
@ Джонатан: вполне возможно. Не говоря уже о путанице со стандартными символами для логических И и ИЛИ, как упоминает Ник Д. выше.   -  person Greg Hewgill    schedule 09.10.2009
comment
+1 за самый интересный вопрос, с которым я столкнулся, который сначала выглядел как один из самых глупых. Я никогда раньше не слышал об этих операторах - если бы они только застряли, мы бы избавились от многих лет головной боли, связанной с дрянными макросами MIN/MAX, которые оценивают операнды дважды.   -  person Michael Burr    schedule 09.10.2009


Ответы (8)


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

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

person Sinan Ünür    schedule 08.10.2009
comment
Это напоминает мне устаревшее ‹? и >? (min и max) операторы и их варианты присваивания ‹?= и ›?=, которые раньше разрешал G++ и с которыми я имел несчастье столкнуться. - person Joey Adams; 09.10.2009
comment
Вероятно, вы правильно догадались: я нашел реализации операторов /\ и \/ как в Unix V6, так и в V7. (bitsavers.org/bits /Interdata/32bit/unix/univWollongong_v6/ и stuff.mit.edu/afs/sipb/project/v7unix/fs/usr/src/cmd/c/c00.c). Оказывается, K&R забыли задокументировать /\ и \/, когда писали Ветхий Завет. Теперь все, что мне нужно знать, это где TH находится Вуллонгонг? ;-) - person NevilleDNZ; 09.10.2009
comment
@NevilleDNZ Хорошая работа. См. maps.google.com/ - person Sinan Ünür; 09.10.2009
comment
В Интернете говорится, что символ \ был добавлен в ASCII Бобом Бемером специально для того, чтобы разрешить операторы /\ и \/. ср. home.ccil.org/~remlaps/www.bobbemer.com/ BRACES.HTM — возможно, иногда — даже по сей день — MIN и MAX реализованы в C с ненадежными побочными эффектами: например, #define MIN(a,b) ((a‹b)?(a):(b )) - person NevilleDNZ; 09.10.2009
comment
Просто любопытно, почему использовались термины «sup» и «inf» вместо того, что, как мне кажется, было более понятным «max» и «min»? Связанные страницы, описывающие «Supremum» и «Infimum», вызывают у меня головную боль. - person Michael Burr; 17.10.2009
comment
Потому что, как правило, максимум и минимум набора не обязательно должны существовать. Например, [0,1) не имеет максимума, но его верхняя граница четко определена. См. также en.wikipedia.org/wiki/Lattice_%28order%29 и связанные ссылки. - person Sinan Ünür; 18.10.2009

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

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

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

person Tamas Czinege    schedule 08.10.2009
comment
+1 за странную тайную магию препроцессора. Это похоже на то, что вы можете увидеть в записи IOCCC. - person Chris Lutz; 09.10.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 Turing Award «Размышления о доверии к доверию ' как-то актуально.

person Jonathan Leffler    schedule 08.10.2009
comment
Если кто-то делает это в коде, который я должен поддерживать, ему лучше покинуть штат... - person T.E.D.; 09.10.2009
comment
@ТЕД. - как насчет разделения / и * комментария на несколько строк с помощью обратной косой черты-новой строки? - person Jonathan Leffler; 09.10.2009
comment
\/ для sup и /\` for inf` установлены математические обозначения. См. также en.wikipedia.org/wiki/Lattice_%28order%29. - person Sinan Ünür; 09.10.2009

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

/\
/ Comment content

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

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

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

// Yet another comment \
This line is in the comment \\
And so is this one!
person Cristián Romo    schedule 08.10.2009
comment
Язык снова меня удивляет. - person GManNickG; 09.10.2009
comment
Я увидел это, когда просматривал стандарт C99 и подумал: «Эй, круто! ... и в основном бесполезно. - person Cristián Romo; 09.10.2009
comment
Сколько комментариев, соответствующих регулярным выражениям, обрабатывают это правильно? И действительно ли это имеет значение, за исключением авторов компиляторов, которым приходится беспокоиться о таких деталях? (Ответы: очень мало и не очень.) - person Jonathan Leffler; 10.10.2009

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

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

person Cade Roux    schedule 08.10.2009

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

person Jerry Coffin    schedule 08.10.2009

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

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

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

person Quintus    schedule 08.10.2009

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

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

person T.E.D.    schedule 08.10.2009
comment
Я думаю, что ОП означает двухсимвольные комбинации /` and \/`, которые еще более бессмысленны. - person Chris Lutz; 09.10.2009