Согласно C ++ '03 Standard 2.3 / 1:
Перед выполнением любой другой обработки каждое вхождение одной из следующих последовательностей из трех символов («триграфические последовательности») заменяется одним символом, указанным в таблице 1.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
В реальной жизни это означает, что код printf( "What??!\n" );
приведет к печати, What|
потому что ??!
это последовательность триграфа, которая заменяется |
символом.
У меня вопрос, зачем использовать триграфы? Есть ли практическая польза от использования триграфов?
UPD : В ответах упоминалось, что на некоторых европейских клавиатурах нет всех знаков препинания, поэтому программисты не из США должны использовать триграфы в повседневной жизни?
UPD2 : в Visual Studio 2010 по умолчанию отключена поддержка триграфа.
Ответы:
Этот вопрос (о близких орграфах) есть ответ.
Это сводится к тому, что набор символов ISO 646 не содержит всех символов синтаксиса C, поэтому есть некоторые системы с клавиатурами и дисплеями, которые не могут работать с символами (хотя я полагаю, что они довольно редки. В наше время).
В общем, вам не нужно их использовать, но вам нужно знать о них именно для той проблемы, с которой вы столкнулись. Триграфы являются причиной того, что
?
символ ' ' имеет escape-последовательность:Итак, пара способов избежать проблемы с вашим примером:
Но вы должны помнить, когда набираете два "?" символы, которые вы могли бы начать с триграфа (и я уж точно никогда не думаю об этом).
На практике триграфы и диграфы - это то, о чем я вообще не беспокоюсь изо дня в день. Но вы должны знать о них, потому что раз в пару лет вы будете сталкиваться с ошибкой, связанной с ними (и вы проведете остаток дня, проклиная их существование). Было бы неплохо, если бы компиляторы могли быть настроены на предупреждение (или ошибку), когда он встречается с триграфом или диграфом, чтобы я мог знать, что у меня есть что-то, с чем я должен сознательно иметь дело.
И просто для полноты: орграфы гораздо менее опасны, поскольку они обрабатываются как токены, поэтому орграф внутри строкового литерала не будет интерпретироваться как орграф.
Чтобы получить хорошее образование о различных развлечениях с пунктуацией в программах на C / C ++ (включая ошибку триграфа, из-за которой я определенно выдергивал волосы), взгляните на статью Херба Саттера GOTW # 86 .
Приложение:
Похоже, что GCC по умолчанию не обрабатывает (и предупреждает) триграфы. В некоторых других компиляторах есть опции для отключения поддержки триграфа (например, IBM). Microsoft начала поддерживать предупреждение (C4837) в VS2008, которое должно быть явно включено (с помощью -Wall или чего-то еще).
источник
Дети сегодня! :-)
Да, иностранное оборудование, например терминал IBM 3270. В 3270, насколько я помню, фигурных скобок нет! Если вы хотели написать C на мини / мэйнфрейме IBM, вам приходилось использовать жалкие триграфы для каждой границы блока. К счастью, мне нужно было написать программное обеспечение на C только для эмуляции некоторых возможностей миникомпьютера IBM, а не на самом деле писать программное обеспечение на C на System / 36.
Посмотрите рядом с клавишей «P»:
Хммм. Трудно сказать. Рядом с «возвратом каретки» есть дополнительная кнопка, и я мог бы перевернуть ее: возможно, это была пара «[» / «]», которая отсутствовала. В любом случае, если бы вам пришлось писать C.
Кроме того, эти терминалы отображают EBCDIC, «родной» набор символов IBM для мэйнфреймов, а не ASCII (спасибо, Павел Минаев, за напоминание).
С другой стороны, как сказано в руководстве по GNU C: «Вам не нужно это повреждение мозга». Компилятор gcc по умолчанию оставляет эту «функцию» отключенной.
источник
Из
The C++ Programming Language
Special Edition, стр. 829источник
`
, который отсутствует в итальянской и некоторых других раскладках клавиатурыОни предназначены для использования в системах, в которых отсутствуют некоторые символы в базовом наборе символов C ++. Излишне говорить, что такие системы чрезвычайно редки.
источник
Триграфы были предложены для удаления в C ++ 0x. Тем не менее, кажется, что все еще есть веские аргументы в их поддержку - см. Документ комитета C ++ N2910, в котором это обсуждается. Судя по всему, EBCDIC - один из основных оплотов, где они нужны.
источник
Я видел триграфы, которые использовались в начале 90-х для преобразования программ PL / 1 с мэйнфрейма для запуска / компиляции / отладки на ПК.
Они занимались редактированием PL / I на ПК с помощью компилятора PL / I в C и хотели, чтобы код работал при возврате к мэйнфрейму, который не поддерживал фигурные скобки. Я предложил использовать такие макросы, как
или как более дружелюбная альтернатива PL / I
и если они действительно хотели вообразить, они могли попробовать
и тогда программа будет выглядеть так, как если бы она была написана на Паскале. Они просто смешно смотрели на меня и не разговаривали со мной до конца дня. Я не думаю, что виню их. :)
Что убило усилия, чем не триграфы, так это различия в системе ввода-вывода между платформами. Открытие файлов на ПК настолько сильно отличалось от мэйнфрейма, что было бы введено слишком много кладжей, чтобы один и тот же код работал на обоих.
источник
В первую очередь потому, что стандарт C представил их еще в 1989 году, когда были проблемы с наличием символов, которым сопоставляются триграфы на некоторых машинах. К тому времени, когда в 1998 году был опубликован стандарт C ++, потребность в триграфах была невелика. Это бородавка на C; они такие же бородавки на C ++. В них была потребность - особенно за пределами англоязычного мира - поэтому они были добавлены в C.
источник
Некоторые европейские клавиатуры не имеют (не имеют?) Всех знаков пунктуации, которые были у американских клавиатур, потому что им нужны были клавиши для их необычных буквенных символов. Так, например (придумывая это), на шведской клавиатуре будет A-образное кольцо на месте фигурной скобки.
Для удобства таких пользователей триграфы - это способ ввода знаков препинания с использованием только наиболее распространенных символов ASCII.
источник
Они там в основном по историческим причинам. В настоящее время большинство современных клавиатур для большинства языков разрешают доступ ко всем этим символам, но раньше это было проблемой с некоторыми европейскими клавиатурами. Вот почему были изобретены триграфы.
Если вы не знаете, для чего они нужны, не используйте их.
Тем не менее, хорошо знать о них, поскольку вы можете случайно или непреднамеренно использовать их в своем коде.
источник