Триграф (языки си)
Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Триграф (в семействе языков Си) — последовательность из трёх символов, первые два из которых — вопросительные знаки, а третий указывает на значение триграфа.
Содержание |
[править] Таблица триграфов
| Триграф | Эквивалентный символ |
|---|---|
| ??= | # |
| ??/ | \ |
| ??' | ^ |
| ??( | [ |
| ??) | ] |
| ??! | | |
| ??< | { |
| ??> | } |
| ??- | ~ |
Комбинация трёх вопросительных знаков (???) не является триграфом.
В реальности триграфы практически не используются, некоторые компиляторы даже выдают предупреждение, когда обрабатывают триграф.
[править] Причина появления
Причина появления триграфов такова. Семибитная кодовая страница ISO/IEC 646, принятая в 1972 году и основанная на ASCII, отводила некоторые позиции (#$@[\]^`{|}~) под национальные символы (дополнительные буквы и символы валют). Например, код { a[i]='\n'; } немцы могли видеть как ä aÄiÜ='Ön'; ü. Чтобы помочь с отсутствующими скобками, и были введены триграфы.
В Паскале с этой же целью используются диграфы: (. .) (* *)<code> вместо <code>[] {}.
[править] Ловушка
Примеры неожиданного поведения при обработке триграфов:
// Will the next line be executed????????????????/ a++;
(a++ будет воспринято как комментарий, так как ??/ будет проинтерпретирован как '\' в конце строки и продлит комментарий на следующу строку)
/??/ * A comment *??/ /
(комментарий, после обработки триграфов и маскированных переводов строк выглядит как /* A comment */)
[править] Пример программы
??=include <stdio.h> /* # */
int main(void)
??< /* { */
char n??(5??); /* [ and ] */
n??(4??) = '0' - (??-0 ??' 1 ??! 2); /* ~, ^ and | */
printf("%c??/n", n??(4??)"); /* ??/ = \ */
return 0;
??>