Escape-последовательности в C
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( сентябрь 2013 г. ) |
В языке программирования C представляет escape-последовательность собой специально разделенный текст в символьном или строковом литерале , который представляет компилятору один или несколько других символов . Это позволяет программисту указывать символы, которые иначе сложно или невозможно указать в литерале.
Escape-последовательность начинается с обратной косой черты ( \ ), называемый escape-символом , а последующие символы определяют значение escape-последовательности. Например, \n обозначает символ новой строки .
Те же или подобные escape-последовательности используются в других родственных языках, таких как C++ , C# , Java и PHP .
Ценить
[ редактировать ]Чтобы продемонстрировать значение функции escape-последовательности, чтобы вывести текст Фу в одну строку и На следующей строке код должен вывести новую строку между двумя словами.
Следующий код достигает цели с помощью форматирования текста и жестко запрограммированного значения символа ASCII для новой строки (0x0A). Это ведет себя по желанию со словами в последовательных строках, но escape-последовательность имеет преимущества.
#include <stdio.h>
int main() {
printf("Foo%cBar", 0x0A);
return 0;
}
The \n escape-последовательность позволяет сократить код, указав новую строку в строковом литерале, и ускорить выполнение, исключив операцию форматирования текста. Кроме того, компилятор может сопоставить escape-последовательность с системой кодирования символов , отличной от ASCII, и тем самым сделать код более переносимым .
#include <stdio.h>
int main() {
printf("Foo\nBar");
return 0;
}
Как это работает
[ редактировать ]Escape-последовательность меняет способ интерпретации компилятором символьных данных в литерале. Например, \n не представляет собой обратную косую черту, за которой следует буква н . Обратная косая черта позволяет избежать обычного, буквального способа интерпретации символьных данных компилятором. После обратной косой черты компилятор ожидает, что последующие символы завершат одну из определенных escape-последовательностей, а затем преобразует escape-последовательность в символы, которые она представляет.
Этот синтаксис требует специальной обработки для кодирования символа обратной косой черты, поскольку это метасимвол , который меняет поведение буквальной интерпретации; а не буквальный символ обратной косой черты. Проблема решается использованием двух обратных косых черт ( \\ ) означает один.
Escape-последовательности
[ редактировать ]В следующей таблице приведены escape-последовательности, определенные в стандарте C, а также некоторые нестандартные последовательности. Стандарт C требует, чтобы для диагностики была escape-последовательность, которая не соответствует определенной последовательности, т. е. компилятор должен вывести сообщение об ошибке. Тем не менее, некоторые компиляторы определяют дополнительные escape-последовательности.
В таблице показано значение ASCII, которому соответствует последовательность, однако оно может сопоставляться с другими значениями в зависимости от кодировки.
Escape-последовательность | Шестнадцатеричное значение в ASCII | Представленный персонаж |
---|---|---|
\а | 07 | Оповещение (звуковой сигнал, звонок) (добавлено в C89) [1] |
\б | 08 | Backspace |
\и примечание 1 | 1Б | Побег персонаж |
\ е | 0С | Разрыв страницы |
\п | 0А | Новая строка (перевод строки); см. ниже |
\р | 0D | Возврат каретки |
\ т | 09 | Горизонтальная вкладка |
\v | 0Б | Вертикальная вкладка |
\\ | 5С | обратная косая черта |
\' | 27 | Апостроф или одинарная кавычка |
\" | 22 | Двойная кавычка |
\? | 3эт. | Вопросительный знак (используется, чтобы избежать триграфов ) |
\ ннн примечание 2 | ннн (восьмеричный) | Байт, числовое значение которого задается nnn, интерпретируется как восьмеричное число. |
\х хх… | хх… | Байт, числовое значение которого задается hh… интерпретируется как шестнадцатеричное число. |
\ ты хххх примечание 3 | не-ASCII | Юникода Кодовая точка ниже 10000 шестнадцатеричного числа (добавлена в C99) [1] : 26 |
\У хххххх примечание 4 | не-ASCII | Кодовая точка Юникода, где h — шестнадцатеричная цифра. |
Побег
[ редактировать ]^ Нестандартная последовательность \e представляет escape-символ в GCC , [2] лязг и tcc . Он не был добавлен в стандарт C, поскольку не имеет значимого эквивалента в некоторых наборах символов (например, EBCDIC ). [1]
Новая строка
[ редактировать ]Последовательность \n соответствует одному байту, несмотря на то, что платформа может использовать более одного байта для обозначения новой строки, например, DOS / Windows последовательность CRLF , 0x0D 0x0A . Перевод с 0x0A в 0x0D 0x0A в DOS и Windows возникает при записи байта в файл или на консоль, а обратная трансляция выполняется при чтении текстовых файлов.
Шестигранник
[ редактировать ]После шестнадцатеричной . escape-последовательности должна идти хотя бы одна шестнадцатеричная цифра \x , без верхней границы; это продолжается до тех пор, пока существует столько шестнадцатеричных цифр. Так, например, \xABCDEFG обозначает байт с числовым значением ABCDEF 16 , за которым следует буква G , который не является шестнадцатеричной цифрой. Однако если полученное целочисленное значение слишком велико, чтобы уместиться в один байт, фактическое назначенное числовое значение определяется реализацией. Большинство платформ имеют 8-битную типы char , что ограничивает полезную шестнадцатеричную escape-последовательность двумя шестнадцатеричными цифрами. Однако шестнадцатеричные escape-последовательности длиной более двух шестнадцатеричных цифр могут быть полезны внутри широкого символа или широкого строкового литерала (с префиксом L):
// single char with value 0x12 (18 decimal)
char s1[] = "\x12";
// single char with implementation-defined value, unless char is long enough
char s1[] = "\x1234";
// single wchar_t with value 0x1234, provided wchar_t is long enough (16 bits suffices)
wchar_t s2[] = L"\x1234";
Восьмеричный
[ редактировать ]^ Восьмеричная escape - последовательность состоит из обратной косой черты, за которой следуют от одной до трех восьмеричных цифр. Восьмеричная escape-последовательность заканчивается, когда она содержит три восьмеричные цифры или следующий символ не является восьмеричной цифрой. Например, \11 — восьмеричная escape-последовательность, обозначающая байт с десятичным значением 9 (11 в восьмеричном формате). Однако, \1111 — восьмеричная escape-последовательность. \111, за которым следует цифра 1 . Чтобы обозначить байт с числовым значением 1, за которым следует цифра 1 , можно использовать "\1""1" , поскольку C объединяет соседние строковые литералы.
Некоторые трехзначные восьмеричные escape-последовательности слишком велики, чтобы уместиться в один байт. В результате получается значение, определенное реализацией результирующего байта.
Последовательность побега \0 — это широко используемая восьмеричная escape-последовательность, которая обозначает нулевой символ с нулевым значением в ASCII и большинстве систем кодирования.
Универсальные имена персонажей
[ редактировать ]^ ^ Начиная со стандарта C99 , C поддерживает escape-последовательности, которые обозначают Unicode кодовые точки , называемые универсальными именами символов . Они имеют форму \у ххх или \U хххххххх , где h означает шестнадцатеричную цифру. В отличие от других escape-последовательностей, универсальное имя символа может расширяться более чем на одну кодовую единицу.
Последовательность \u hhhh обозначает кодовую точку hhhh , интерпретируемый как шестнадцатеричное число. Последовательность \U hhhhhhhh обозначает кодовую точку hhhhhhhh , интерпретируемый как шестнадцатеричное число. Кодовые точки, расположенные по адресу U+10000 или выше, должны обозначаться знаком Синтаксис \U , тогда как более низкие кодовые точки могут использовать \u или \У . Кодовая точка преобразуется в последовательность кодовых единиц в кодировке типа назначения в целевой системе. Например, если кодировка UTF-8 и UTF-16 для wchar_t :
// A single byte with the value 0xC0; not valid UTF-8
char s1[] = "\xC0";
// Two bytes with values 0xC3, 0x80; the UTF-8 encoding of U+00C0
char s2[] = "\u00C0";
// A single wchar_t with the value 0x00C0
wchar_t s3[] = L"\xC0";
// A single wchar_t with the value 0x00C0
wchar_t s4[] = L"\u00C0";
Значение больше, чем \U0000FFFF может быть представлен одним wchar_t , если используется кодировка UTF-32 , или два, если используется UTF-16.
Главное, универсальное имя персонажа \u00C0 всегда обозначает символ «À», независимо от того, в каком строковом литерале он используется или какая кодировка используется. Восьмеричные и шестнадцатеричные escape-последовательности всегда обозначают определенные последовательности числовых значений, независимо от кодировки. Следовательно, универсальные имена символов дополняют восьмеричные и шестнадцатеричные escape-последовательности; в то время как восьмеричные и шестнадцатеричные escape-последовательности представляют собой кодовые единицы, имена универсальных символов представляют собой кодовые точки, которые можно рассматривать как «логические» символы.
Альтернативы
[ редактировать ]Некоторые языки предоставляют различные механизмы кодирования поведения, которые обеспечивает escape-последовательность. Например, следующий код Паскаля записывает два слова в последовательные строки:
writeln('Foo');
write('Bar');
writeln выводит новую строку после текста параметра, а писать нет.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с «Обоснование международного стандарта — языки программирования — C» (PDF) . 5.10. Апрель 2003 г. Архивировано (PDF) из оригинала 6 июня 2016 г. Проверено 17 октября 2010 г.
- ^ «6.35 Символ <ESC> в константах» . GCC 4.8.2 Руководство . Архивировано из оригинала 12 мая 2019 г. Проверено 8 марта 2014 г.
Дальнейшее чтение
[ редактировать ]- ISO/IEC 9899:1999, Языки программирования — C.
- Керниган, Брайан В .; Ричи, Деннис М. (2003) [1988]. Язык программирования C (2-е изд.). Прентис Холл . ISBN 978-0-13308621-8 .
- Лафоре, Роберт (2001). Объектно-ориентированное программирование на Turbo C++ (1-е изд.). Публикации Галгоции. ISBN 978-8-18562322-1 .