Триграф (языки си)
Триграф (в семействе языков Си) — последовательность из трёх символов, первые два из которых — вопросительные знаки, а третий указывает на значение триграфа.
Таблица триграфов
Триграф | Эквивалентный символ |
---|---|
??= | # |
??/ | \ |
??' | ^ |
??( | [ |
??) | ] |
??! | | |
??< | { |
??> | } |
??- | ~ |
Комбинация трёх вопросительных знаков (???) не является триграфом.
В реальности триграфы практически не используются, некоторые компиляторы даже выдают предупреждение, когда обрабатывают триграф.
Причина появления
Причина появления триграфов такова. Семибитная кодовая страница ISO/IEC 646, принятая в 1972 году и основанная на ASCII, отводила некоторые позиции (#$@[\]^`{|}~
) под национальные символы (дополнительные буквы и символы валют). Например, код { a[i]='\n'; }
немцы могли видеть как ä aÄiÜ='Ön'; ü
. Чтобы помочь с отсутствующими скобками, и были введены триграфы.
В Паскале с этой же целью используются диграфы: (. .) (* *)
вместо
[] {}
.
Ловушка
Примеры неожиданного поведения при обработке триграфов:
// 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;
??>
См. также
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....