Триграф (в семействе языков Си) () — последовательность из трёх символов, первые два из которых — вопросительные знаки («??»), а третий указывает на значение триграфа. Триграфы обрабатываются препроцессором C/C++.
Таблица триграфов
ТриграфЭквивалентный символ ??=# ??/\ ??'^ ??([ ??)] ??!| ??<{ ??>
??-~
Комбинация трёх вопросительных знаков («???») не является триграфом.
В реальности триграфы практически не используются. Некоторые компиляторы (например, ) даже выдают предупреждение при обработке триграфов.
История
Причина появления триграфов заключается в том, что семибитный стандарт кодирования символов ISO 646, опубликованный в 1967 году и основанный на ASCII, отводил позиции символов #, $, @, [, \, ], ^, `, {, |, }, ~ под национальные символы (например, диакритизованные буквы и знаки валют). Из-за этого, к примеру, немцы могли видеть код как . Для замены отсутствующих скобок и были введены триграфы.
В Паскале с этой же целью используются диграфы: (. .) (* *) вместо [] {}.
В стандарте C++17 триграфы отменены«Removing trigraphs??! », N3981, Richard Smith, 2014-05-06; . Обещают отменить и в Си23.
Примеры неожиданного поведения
Далее приведены примеры использования триграфа «??/», заменяемого на символ «\». Символ «\» является экранирующим для символа перевода строки.
// Will the next line be executed????????????????/ a++;
После замены «??/» на «\» код a++; во 2-й строке будет считаться продолжением комментария, начатого в 1-й строке.
/??/ * 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; ??>
См. также Диграф (языки Си) Диграф (программирование)
Примечания
Категория:Си (язык программирования) Категория:Статьи с примерами кода Си Категория:Триграфы