Escape-последовательности в C

редактировать
escape-символы и связанные с ними в языке программирования C

Escape-последовательности используются в языках программирования C и C ++, и их дизайн был скопирован на многих других языках, таких как Java и C #. Управляющая последовательность - это последовательность символов, которая не представляет себя при использовании внутри символа или строки literal, но транслируется в другой символ или последовательность символов, которые может быть трудно или невозможно представить напрямую.

В C все escape-последовательности состоят из двух или более символов, первый из которых - обратная косая черта, \ (называемый «escape-символом »); остальные символы определяют интерпретацию escape-последовательности. Например, \ n - это escape-последовательность, которая обозначает символ новой строки.

Содержание
  • 1 Обоснование
  • 2 Таблица управляющих последовательностей
    • 2.1 Примечания
    • 2.2 Нестандартные escape-последовательности
    • 2.3 Универсальные имена символов
  • 3 См. Также
  • 4 Ссылки
  • 5 Дополнительная литература
Мотивация

Предположим, мы хотим напечатать Hello, в одной строке, а затем world! на следующей строке. Можно попытаться представить печатаемую строку как отдельный литерал следующим образом:

#include int main () {printf ("Hello, world!"); }

Это недопустимо в C, поскольку строковый литерал не может охватывать несколько логических исходных строк. Это можно обойти, напечатав символ новой строки, используя его числовое значение (0x0A в ASCII ),

#include int main () {printf ("Здравствуйте,% cworld! ", 0x0A); }

Это указывает программе вывести Hello, за которым следует байт с числовым значением 0x0A, за которым следует world !. Хотя это действительно будет работать, когда машина использует кодировку ASCII, это не будет работать в системах, которые используют другие кодировки, которые имеют другое числовое значение для символа новой строки. Это также не очень хорошее решение, потому что оно по-прежнему не позволяет представлять символ новой строки внутри литерала, а вместо этого использует семантику printf. Чтобы решить эти проблемы и обеспечить максимальную переносимость между системами, C интерпретирует \ n внутри литерала как символ новой строки, независимо от того, что он может быть в целевой системе:

#include int main () { printf ("Привет, \ nмир!"); }

В этом коде escape-последовательность \ n не означает обратную косую черту, за которой следует буква n, потому что обратная косая черта вызывает «escape» из обычных символов. интерпретируются компилятором. Увидев обратную косую черту, компилятор ожидает, что другой символ завершит escape-последовательность, а затем переводит escape-последовательность в байты, которые она предназначена для представления. Итак, «Привет, \ n мир!» представляет строку со встроенным символом новой строки, независимо от того, используется ли она внутри printf или где-либо еще.

Это поднимает вопрос о том, как представить фактическую обратную косую черту внутри литерала. Это делается с помощью escape-последовательности \\, как показано в следующем разделе.

Некоторые языки не имеют escape-последовательностей, например Pascal. Вместо этого будет использоваться команда, включающая новую строку (Writeln включает новую строку, write исключает ее).

Writeln ('Привет'); написать ('мир!');
Таблица escape-последовательностей

Следующие escape-последовательности определены в стандарте C. В этой таблице также показаны значения, которым они сопоставляются в ASCII. Однако эти escape-последовательности могут использоваться в любой системе с компилятором C и могут отображаться на другие значения, если система не использует кодировку символов на основе ASCII.

Escape sequenceHex value in ASCIIПредставленный символ
\a07Alert (Beep, Bell) (добавлен в C89)
\b08Backspace
\e1BEscape character
\f0CПодача страницы Разрыв страницы
\n0AНовая строка (Перенос строки); см. примечания ниже
\r0DВозврат каретки
\t09Горизонтальная табуляция
\v0BВертикальная табуляция
\\5CОбратная косая черта
\'27Апостроф или одинарная кавычка
\"22Двойная кавычка
\?3FВопросительный знак (используется, чтобы избежать триграфов )
\nnnлюбогоБайт, числовое значение которого дается nnn, интерпретируемый как восьмеричное число
\ xhh…любойБайт, числовое значение которого дается hh… интерпретируется как шестнадцатеричное число
\uhhhhнетКодовая точка Unicode ниже 10000 шестнадцатеричных
\UhhhhhhhhнетКодовая точка Unicode, где h - шестнадцатеричная цифра
Примечание 1. ^Обычный нестандартный код; см. Раздел «Примечания» ниже.
Примечание 2. ^Может присутствовать одна, две или три восьмеричных цифры n; см. Раздел «Примечания» ниже.
Примечание 3. ^\ u принимает 4 шестнадцатеричных цифры h; см. Раздел «Примечания» ниже.
Примечание 4. ^\ U принимает 8 шестнадцатеричных цифр h; см. Раздел «Примечания» ниже.

Notes

\ n производит один байт, несмотря на то, что • платформа может использовать более одного байта для обозначения новой строки, например, последовательность DOS / Windows CR-LF, 0x0D 0x0A. Преобразование из 0x0A в 0x0D 0x0A в DOS и Windows происходит, когда байт записывается в файл или в консоль, а обратное преобразование выполняется при чтении текстовых файлов.

Шестнадцатеричная escape-последовательность должна содержать хотя бы одну шестнадцатеричную цифру после \ x без верхней границы; он продолжается для всех имеющихся шестнадцатеричных цифр. Так, например, \ xABCDEFG обозначает байт с числовым значением ABCDEF 16, за которым следует буква G, которая не является шестнадцатеричной цифрой. Однако, если результирующее целочисленное значение слишком велико, чтобы поместиться в один байт, фактическое присвоенное числовое значение определяется реализацией. Большинство платформ имеют 8-битные типы символов, что ограничивает полезную шестнадцатеричную escape-последовательность двумя шестнадцатеричными цифрами. Однако шестнадцатеричные escape-последовательности длиной более двух шестнадцатеричных цифр могут быть полезны внутри широкого символа или широкого строкового литерала (с префиксом L):

char s1 = "\ x12"; // одиночный символ со значением 0x12 (18 в десятичном формате) char s1 = "\ x1234"; // одиночный символ со значением, определяемым реализацией, если char не достаточно длинный wchar_t s2 = L "\ x1234"; // одиночный wchar_t со значением 0x1234 при условии, что wchar_t достаточно длинный (достаточно 16 бит)

Восьмеричная escape-последовательность состоит из \, за которыми следуют одна, две или три восьмеричных цифры. Восьмеричная escape-последовательность заканчивается, когда она либо уже содержит три восьмеричных цифры, либо следующий символ не является восьмеричной цифрой. Например, \ 11 - это одиночная восьмеричная escape-последовательность, обозначающая байт с числовым значением 9 (11 в восьмеричном формате), а не escape-последовательность \ 1, за которой следует цифра 1. Однако \ 1111 - это восьмеричная escape-последовательность \ 111, за которой следует цифра 1. Чтобы обозначить байт числовым значением 1, за которым следует цифра 1, можно использовать "\ 1" "1", поскольку C автоматически объединяет смежные строковые литералы. Обратите внимание, что некоторые трехзначные восьмеричные escape-последовательности могут быть слишком большими, чтобы поместиться в один байт; в результате получается значение, определяемое реализацией для фактически созданного байта. Управляющая последовательность \ 0 - это обычно используемая восьмеричная escape-последовательность, которая обозначает нулевой символ со значением ноль.

Нестандартные escape-последовательности

Последовательность, такая как \ z, не является допустимой escape-последовательностью в соответствии со стандартом C, так как она не найдена в таблице выше. Стандарт C требует диагностики таких «недопустимых» escape-последовательностей (т.е. компилятор должен вывести сообщение об ошибке). Несмотря на это, некоторые компиляторы могут определять дополнительные escape-последовательности с семантикой, определяемой реализацией. Примером является escape-последовательность \ e, которая имеет 1B как шестнадцатеричное значение в ASCII, представляет собой escape-символ и поддерживается в GCC, clang и tcc. Однако он не был добавлен в стандартный репертуар C, потому что не имеет значимого эквивалента в некоторых наборах символов (например, EBCDIC ).

Универсальные имена символов

Из C99 стандарт, C также поддерживает escape-последовательности, которые обозначают кодовые точки Unicode в строковых литералах. Такие escape-последовательности называются универсальными именами символов и имеют форму \ uhhhh или \ Uhhhhhhhh, где h обозначает шестнадцатеричную цифру. В отличие от других рассматриваемых escape-последовательностей, универсальное имя символа может расширяться до нескольких единиц кода.

Последовательность \ uhhhh обозначает кодовая точка hhhh, интерпретируется как шестнадцатеричное число. Последовательность \ Uhhhhhhhh обозначает кодовую точку hhhhhhhh, интерпретируемую как шестнадцатеричное число. (Следовательно, кодовые точки, расположенные в U + 10000 или выше должны быть обозначены синтаксисом \ U, тогда как более низкие кодовые точки могут использовать \ u или \ U.) Кодовая точка преобразуется в последовательность кодовых единиц в кодировке g типа назначения в целевой системе. Например, рассмотрим

char s1 = "\ xC0"; char s2 = "\ u00C1"; wchar_t s3 = L "\ xC0"; wchar_t s4 = L "\ u00C0";

Строка s1 будет содержать один байт (не считая завершающего нуля), числовое значение которого, фактическое значение, хранящееся в памяти, на самом деле 0xC0. Строка s2 будет содержать символ «Á», U + 00C1 ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА A С ОСТРЫМ. В системе, использующей кодировку UTF-8, строка s2 будет содержать два байта, 0xC3 0xA1. Строка s3 содержит единственный wchar_t, снова с числовым значением 0xC0. Строка s4 содержит символ «À», закодированный в wchar_t, если используется кодировка UTF-16, то s4 также будет содержать только один wchar_t, Длина 16 бит, с числовым значением 0x00C0. Универсальное имя символа, такое как \ U0001F603, может быть представлено одним wchar_t, если используется кодировка UTF-32, или двумя, если используется UTF-16.

Важно отметить, что универсальное имя символа \ u00C0 всегда обозначает символ «À», независимо от того, в каком строковом литерале он используется, или от используемой кодировки. Опять же, \ U0001F603 всегда обозначает символ в кодовой точке 1F603 16, независимо от контекста. С другой стороны, восьмеричные и шестнадцатеричные escape-последовательности всегда обозначают определенные последовательности числовых значений, независимо от кодировки. Следовательно, универсальные имена символов дополняют восьмеричные и шестнадцатеричные escape-последовательности; в то время как восьмеричные и шестнадцатеричные escape-последовательности представляют собой «физические» кодовые единицы, универсальные имена символов представляют собой кодовые точки , которые можно рассматривать как «логические» символы.

См. Также
Ссылки
Дополнительная литература
Последняя правка сделана 2021-05-19 14:34:49
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте