Лучшие вопросы
Таймлайн
Чат
Перспективы
Триграф (языки Си)
в Си-подобных языках: последовательность из трёх символов, первые два из которых — вопросительные знаки Из Википедии, свободной энциклопедии
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;
??>
См. также
Примечания
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads