Лучшие вопросы
Таймлайн
Чат
Перспективы

Триграф (языки Си)

в Си-подобных языках: последовательность из трёх символов, первые два из которых — вопросительные знаки Из Википедии, свободной энциклопедии

Remove ads

Триграф (в семействе языков Си) (англ. trigraph) — последовательность из трёх символов, первые два из которых — вопросительные знаки («??»), а третий указывает на значение триграфа. Триграфы обрабатываются препроцессором C/C++.

Таблица триграфов

Подробнее Триграф, Эквивалентный символ ...

Комбинация трёх вопросительных знаков («???») не является триграфом.

В реальности триграфы практически не используются. Некоторые компиляторы (например, gcc) даже выдают предупреждение при обработке триграфов.

История

Причина появления триграфов заключается в том, что семибитный стандарт кодирования символов ISO 646, опубликованный в 1967 году и основанный на ASCII, отводил позиции символов #, $, @, [, \, ], ^, `, {, |, }, ~ под национальные символы (например, диакритизованные буквы и знаки валют). Из-за этого, к примеру, немцы могли видеть код { a[i] = '\n'; } как ä aÄiÜ = 'Ön'; ü. Для замены отсутствующих скобок и были введены триграфы.

В Паскале с этой же целью используются диграфы: (. .) (* *) вместо [] {}.

В стандарте C++17 триграфы отменены[1][2]. Обещают отменить и в Си23.

Remove ads

Примеры неожиданного поведения

Далее приведены примеры использования триграфа «??/», заменяемого на символ «\». Символ «\» является экранирующим для символа перевода строки.

// 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;
??>

См. также

Примечания

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads