Что _did_ операторы C /\ и \/ делают?
Любой может "объявить" свои собственные операторы в C.... это если вы гуру компилятора C и имеете исходный код для компилятора C!;-)
Дополнительные вопросы к головоломке:
- Как эти операции выполняются в C99? НКУ? ...
- И почему /\ & \/ упали?
- Для каких типов действовали операторы / \ и \ /?
Поиск в 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 ответов
Ни \ / ни / не определены как операторы в стандарте 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" (или что-то похожее на это). Кто-то может захотеть назвать переменную это.