Что такое строковый литерал

Пользовательские литералы в C++11

Более полугода прошло с момента принятия стандарта C++11. В сети можно найти много материалов посвященных новому стандарту, однако большинство из них касаются самых простых возможностей, самых сладких. Я говорю о лямбда-функциях, системе автоматического выведения типов, новых спецификаторах, умных указателях и т.д. Да, это действительно интересные вещи и, можно смело сказать, они одни из самых полезных и часто используемых. Но на них свет клином не сошелся, и новенький C++11 предлагает нам не только их.

Ниже я хочу рассказать о пользовательских литералах — весьма полезном средстве, хоть и не в повседневных целях.

Что такое литерал?

Литерал — это некоторое выражение, создающее объект. Литералы появились не только в C++11, они были и в C++03. Например, есть литералы для создания символа, строки, вещественных чисел, и т.д.

Все это литералы. С понятием литералов, думаю, мы разобрались. Самое время вернуться к C++11.

Пользовательские литералы в C++11

Как уже было отмечено выше, новый стандарт предлагает средства для создания пользовательских литералов. Существует две категории пользовательских литералов: сырые литералы (raw) и литералы для встроенных типов (cooked).

Стоит, однако, заметить, что C++ позволяет создавать только литералы-суфиксы. Иными словами, создать литералы префиксы (как, например, 0x), или префиксо-суфиксные (как «») — не получится.

Литералы для численных типов

Начнем с литералов для встроенных типов. Чтобы создать литерал для численных типов необходимо воспользоваться одной из двух сигнатур:

Использование литерала будет осуществляется следующим образом:

Ниже приведен пример литерала, преобразовывающего минуты в секунды.

Литералы для строковых типов

Для создания литерала этого типа, необходимо воспользоваться одной из следующих сигнатур:

Сигнатура выбирается в зависимости от типа строки:

Пример литерала преобразующего C-style строку в std::string приведен ниже.

Сырые литералы

Ну и наконец настало время сырого литерала. Сигнатура сырого литерала выглядит следующим образом:

Этот тип литералов приходит на помощь тогда, когда входное число надо разобрать посимвольно. Т.e. в этом случае число передается в оператор как строка. Если не совсем понятно, взгляните на приведенный ниже код:

Используя данный тип литералов, можно написать литерал преобразующий двоичное число в десятичное. Например вот так:

Существует еще одна сигнатура для сырых литералов. Основана она на применении Variadic Template:

Преимущества литералов на базе Variadic Template заключается в том, что они могут вычисляться на этапе компиляции. Тот же литерал преобразования двоичного числа в десятичное может быть переписан так:

У внимательно читателя мог возникнуть вопрос: «А что если создать и сырой литерал, и литерал для числа с одним и тем же именем? Какой литерал компилятор применит?». Стандарт по этому поводу дает точный ответ и говорит о попытке компилятора применить литералы в следующем порядке:

Выводы

Бьёрн Страуструп на конференции Going Native 2012 приводил полезный пример использования литералов. Мне кажется, он наглядно демонстрирует факт повышения читаемости кода, а также снижает вероятность ошибиться.

Механизм пользовательских литералов — это полезный в некоторых случаях инструмент. Использовать его где попало не стоит. Подумайте дважды, прежде чем их использовать, ведь литералы коварны: они могут…

Источник

4.13 – Литералы

В программировании константа – это фиксированное значение, которое нельзя изменять. В C++ есть два типа констант: литеральные константы и символьные константы. В этом уроке мы рассмотрим литеральные константы, а в следующем – символьные константы.

Литеральные константы (обычно называемые просто литералами) – это значения, вставленные непосредственно в код. Например:

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

Так же, как у объектов есть тип, тип есть и у всех литералов. Тип литерала предполагается из значения и формата самого литерала.

Суффиксы литералов

Если тип литерала по умолчанию не соответствует необходимому, вы можете изменить тип литерала, добавив суффикс:

Обычно вам не нужно использовать суффиксы для целочисленных типов, но вот пара примеров:

Начинающие программисты часто не понимают, почему следующий код работает не так, как ожидалось:

Литералы можно использовать в коде C++, если их значения понятны. Чаще всего это происходит при использовании для инициализации или присвоения значения переменной, выполнения математических операций или вывода текста на экран.

Строковые литералы

В уроке «4.11 – Символы» мы определили строку как набор последовательных символов. C++ поддерживает строковые литералы:

Экспоненциальная запись для числовых литералов с плавающей запятой

Есть два разных способа объявить литералы с плавающей точкой:

Во второй форме число после экспоненты может быть отрицательным:

Литералы в восьмеричной и шестнадцатеричной системах счисления

В повседневной жизни мы считаем, используя числа в десятичной системе счисления, где каждая цифра может быть 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9. Десятичная система счисления число также называется «с основанием 10», потому что в ней возможно использование 10 цифр (от 0 до 9). В этой системе мы считаем так: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,… По умолчанию, числа в программах на C++ считаются десятичными.

В двоичной системе счисления всего 2 цифры: 0 и 1, поэтому она называется «с основанием 2». В двоичном формате мы считаем так: 0, 1, 10, 11, 100, 101, 110, 111,…

Существуют две других системы счисления, которые иногда используются в вычислениях: восьмеричная и шестнадцатеричная.

Восьмеричная система счисления – с основанием 8, то есть доступны только цифры: 0, 1, 2, 3, 4, 5, 6 и 7. В восьмеричном формате мы считаем так: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12,… (примечание: цифр 8 и 9 нет, поэтому мы сразу переходим от 7 к 10).

Десятичная система01234567891011
Восьмеричная система0123456710111213

Чтобы использовать литерал в восьмеричном формате, добавьте к вашему литералу префикс 0 (ноль):

Эта программа печатает:

Почему 10, а не 12? Потому что числа печатаются в десятичном формате, а 12 в восьмеричном формате = 10 десятичном формате.

Восьмеричная система счисления практически не используется, и мы рекомендуем вам ее избегать.

Десятичная система01234567891011121314151617
Восьмеричная система0123456789ABCDEF1011

Эта программа печатает:

Поскольку для одной шестнадцатеричной цифры возможны 16 различных значений, мы можем сказать, что одна шестнадцатеричная цифра использует 4 бита. Следовательно, пара шестнадцатеричных цифр может использоваться для точного представления полного байта.

До C++14 не было возможности назначить литерал в двоичном формате. Однако шестнадцатеричные пары предоставляют нам для этого полезный обходной путь:

Литералы в двоичном формате и разделители цифр C++14

В C++14 мы можем назначать литералы в двоичном формате с помощью префикса 0b :

Поскольку длинные литералы трудночитаемы, в C++14 также добавлена ​​возможность использования кавычек ( ‘ ) в качестве разделителя цифр.

Если ваш компилятор несовместим с C++14, он пожалуется, если вы попытаетесь использовать любой из этих приемов.

Печать десятичных, восьмеричных, шестнадцатеричных и двоичных чисел

Эта программа печатает:

Эта программа напечатает:

Мы также можем создать временный (анонимный) std::bitset для печати одного значения. В приведенном выше коде эта строка:

Магические числа, и почему это плохо

Рассмотрим следующий фрагмент:

Число, такое как 30 в приведенном выше фрагменте, называется магическим числом. Магическое число – это литерал (обычно число) в середине кода, не имеющий никакого контекста. Что значит 30? Хотя вы, наверное, догадываетесь, что в данном случае это максимальное количество студентов в классе, но это не совсем очевидно. В более сложных программах может быть очень сложно сделать вывод, что представляет собой жестко запрограммированное число, если нет комментария, объясняющего его.

Использование магических чисел обычно считается плохой практикой, потому что, помимо отсутствия контекста, для чего они используются, они создают проблемы, если значение необходимо изменить. Предположим, школа покупает новые парты, позволяющие увеличить количество учеников в классе с 30 до 35, и наша программа должна это отразить. Рассмотрим следующую программу:

Хотя мы говорим «магические числа», это относится ко всем видам значений. Рассмотрим следующий пример:

В этом примере только одно число (100), но оно также используется в строках. Если мы решим обновить максимальное количество, скажем, на 200, нам придется обновить три разных случая, где встречается 100.

К счастью, существуют лучшие варианты (символьные константы). Об этом мы поговорим на следующем уроке.

Лучшая практика

Не используйте магические числа в своем коде.

Источник

Строковые и символьные литералы (C++)

В C++ поддерживаются различные типы строк и символов, а также доступны различные способы выражения значений литералов каждого из этих типов. В исходном коде содержимое символьных и строковых литералов выражается с помощью кодировки. Универсальные имена символов и escape-символы позволяют представить любую строку, используя только основную кодировку исходного кода. Необработанные строковые литералы позволяют не использовать escape-символы и могут применяться для выражения всех типов строковых литералов. Можно также создавать std::string литералы без необходимости выполнения дополнительных действий по созданию или преобразованию.

Символьные литералы

Символьный литерал состоит из символьной константы. Он представляется символом, заключенным в одинарные кавычки. Существует пять типов символьных литералов:

Символьные литералы UTF-8 типа char ( char8_t в c++ 20), например u8’a’

Символ, используемый для символьного литерала, может быть любым символом, за исключением символов обратной косой черты ( \ ), одинарной кавычки ( ) или новой строки. Зарезервированные символы можно указывать с помощью escape-последовательности. Символы можно указывать с помощью универсальных имен символов, при условии что тип является достаточно крупным для размещения символа.

Кодирование

Символьные литералы кодируются по-разному в соответствии с их префиксом.

Символьный литерал, начинающийся с L префикса, является литералом расширенных символов. Значение литерала расширенных символов, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное числовому значению его кодировки в наборе расширенных символов выполнения, если только символьный литерал не имеет представления в наборе расширенных символов выполнения, в этом случае значение определяется реализацией. Значение литерала расширенных символов, содержащего несколько символов, escape-последовательностями или универсальных имен символов, определяется реализацией. дополнительные MSVC см. в разделе, относящемся к корпорации майкрософт ниже.

Символьный литерал, начинающийся с u8 префикса, является символьным литералом UTF-8. Значение символьного литерала UTF-8, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено в одной единице кода UTF-8 (соответствующее элементам управления C0 и основному регистру символов латиницы). Если значение не может быть представлено одной единицей кода UTF-8, программа неправильно сформирована. Символьный литерал в кодировке UTF-8, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Символьный литерал, начинающийся с u префикса, является символьным литералом UTF-16. Значение символьного литерала UTF-16, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено одной единицей кода UTF-16 (соответствующей базовой многоязыковой плоскости). Если значение не может быть представлено одной единицей кода UTF-16, программа неправильно сформирована. Символьный литерал UTF-16, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Символьный литерал, начинающийся с U префикса, является символьным литералом UTF-32. Значение символьного литерала UTF-32, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению кодовой точки ISO 10646. Символьный литерал в кодировке UTF-32, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

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

Существует три вида escape-последовательностей: простая, восьмеричная и шестнадцатеричная. Escape-последовательностями могут быть следующие значения:

ЗначениеEscape-последовательность
новая строка\n
обратная косая черта\\
горизонтальная табуляция\t
вопросительный знак? или \?
вертикальная табуляция\v
одинарная кавычка\’
BACKSPACE\b
двойная кавычка
Возврат каретки\r
нуль-символ\0
Смена страницы\f
восьмеричный\ooo
оповещение (колокольчик)\a
шестнадцатеричный\xhhh

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

Обратная косая черта ( \ ) — это символ продолжения строки, когда он помещается в конец строки. Если символ обратной косой черты требуется использовать как символьный литерал, необходимо ввести две косые черты подряд ( \\ ). Дополнительные сведения о символе продолжения строки см. в разделе Phases of Translation.

Специально для систем Майкрософт

Чтобы создать значение из короткого многосимвольного литерала, компилятор преобразует символ или последовательность символов между одинарными кавычками в 8-битные значения в пределах 32-разрядного целого числа. Несколько символов в литерале заполняют соответствующие байты по мере необходимости от высокого до низкого порядка. Затем компилятор преобразует целое число в целевой тип после обычных правил. Например, чтобы создать char значение, компилятор принимает байт нижнего порядка. Для создания значения wchar_t или char16_t компилятор принимает младшее слово. Компилятор выдает предупреждение о том, что результат усекается, если какие-либо биты заданы выше назначенного байта или слова.

Восьмеричная escape-последовательность, которая содержит более трех цифр, рассматривается как восьмеричная последовательность из 3 цифр, за которой следуют последующие цифры как символы в многосимвольном литерале, что может привести к неудивительному результату. Пример:

Escape-последовательности, которые содержат невосьмеричные символы, вычисляются в виде восьмеричной последовательности вплоть до последнего восьмеричного символа, за которыми следуют оставшиеся символы в виде последующих символов в многосимвольном литерале. Предупреждение C4125 создается, если первый невосьмеричный символ является десятичной цифрой. Пример:

Восьмеричная escape-последовательность, которая имеет большее значение, чем \377 Ошибка C2022: » \377 «: слишком большое для символа.

Escape-последовательность, которая содержит шестнадцатеричные и нешестнадцатеричные символы, вычисляется как многосимвольный литерал, содержащий шестнадцатеричную escape-последовательность вплоть до последнего шестнадцатеричного символа, за которыми следуют нешестнадцатеричные символы. Шестнадцатеричная escape-последовательность, которая не содержит шестнадцатеричных цифр, приводит к ошибке компилятора C2153: «шестнадцатеричные литералы должны содержать по крайней мере одну шестнадцатеричную цифру».

Если в расширенном символьном литерале с префиксом L содержится последовательность из множества символов, значение берется из первого символа, а компилятор выдает предупреждение C4066. Последующие символы игнорируются, в отличие от поведения эквивалентного обычного многосимвольного литерала.

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

В символьных литералах и машинных (не являющихся необработанными) строковых литералах любой символ может быть представлен универсальным именем символа. Универсальные имена символов формируются с помощью префикса, \U за которым следует 8-значная кодовая точка Юникода или префикс, \u за которым следует 4-значная кодовая точка Юникода. Все восемь или четыре знака, соответственно, должны присутствовать для создания корректного универсального имени символа.

Суррогатные пары

В C++03 языком допускалось, чтобы универсальными именами символов представлялось лишь определенное подмножество символов. Также могли существовать универсальные имена символов, не представляющие никаких допустимых символов Юникода. Эта ошибка была исправлена в стандарте C++ 11. В C++11 в символьных и строковых литералах и идентификаторах можно использовать универсальные имена символов. Дополнительные сведения об универсальных именах символов см. в разделе Character Sets. Дополнительные сведения о Юникоде см. в статье Unicode. Дополнительные сведения о суррогатных парах см. в статье Surrogate Pairs and Supplementary Characters(Суррогатные пары и дополнительные символы).

Строковые литералы

Строковый литерал представляет последовательность символов, которые вместе образуют строку с завершающим нулем. Символы должны быть заключены в двойные кавычки. Существуют следующие типы строковых литералов.

Узкие строковые литералы

Строки в кодировке UTF-8

Широкие строковые литералы

char16_t и char32_t (C++11)

В C++11 доступны символьные типы char16_t (портативный, 16-разрядный Юникод) и char32_t (32-разрядный Юникод):

Необработанные строковые литералы (C++ 11)

Необработанный строковый литерал — это массив с завершающим нулем (любой символьный тип), содержащий любой графический символ, включая двойные кавычки ( « ), обратную косую черту ( \ ) или символ новой строки. Необработанные строковые литералы часто применяются в регулярных выражениях, которые используют классы символов, а также в строках HTML и XML. Примеры см. в следующей статье: Bjarne Stroustrup’s FAQ on C++11(Вопросы и ответы о C++11 от Бьерна Страуструпа).

Однако ошибку можно устранить с помощью разделителя:

Можно создать необработанный строковый литерал, содержащий символ новой строки (не экранированный символ) в источнике:

литералы std:: String (C++ 14)

s Суффикс можно также использовать для необработанных строковых литералов:

Размер строковых литералов

Обратите внимание, что strlen() и wcslen() не включайте размер завершающего нуль-символа, размер которого равен размеру элемента строкового типа: один байт в char* char8_t* строке или, два байта wchar_t* или char16_t* строки и четыре байта в char32_t* строках.

Максимальная длина строкового литерала составляет 65 535 байт. Это ограничение применимо как к узким, так и к расширенным строковым литералам.

Изменение строковых литералов

Поскольку строковые литералы (не включая std::string литералы) являются константами, попытка их изменить, например, str[2] = ‘A’ приводит к ошибке компилятора.

Специально для систем Майкрософт

В некоторых случаях идентичные строковые литералы могут быть объединены в пул для экономии места в исполняемом файле. При объединении строковых литералов в пулы компилятор делает так, что все ссылки на определенный строковый литерал указывают на одну и ту же область в памяти, вместо того чтобы каждая ссылка указывала на отдельный экземпляр строкового литерала. Чтобы включить объединение строк, используйте /GF параметр компилятора.

Сцепление смежных строковых литералов

Все смежные расширенные и узкие строковые литералы соединяются. Данное объявление:

идентично следующему объявлению:

и следующему объявлению:

Использование внедренных шестнадцатеричных escape-кодов для задания строковых литералов может привести к непредвиденным результатам. В следующем примере выполняется попытка создать строковый литерал, содержащий символ ASCII 5, за которым следуют символы f, i, v и e:

Фактический результат (шестнадцатеричное значение 5F) является кодом ASCII для символа подчеркивания, за которым следуют символы i, v и e. Чтобы получить правильный результат, можно использовать одну из следующих escape-последовательностей:

Строковые литералы с универсальными именами символов

Машинные (не являющиеся необработанными) строковые литералы могут использовать универсальные имена символов для представления любого символа, при условии что универсальные имена можно кодировать как один или несколько символов в строковом типе. Например, универсальное имя символа, представляющее расширенный символ, не может быть закодировано в виде короткой строки с помощью кодовой страницы ANSI, но может быть закодировано в виде узких строк в некоторых многобайтовых кодовых страницах или в строках UTF-8 или в расширенной строке. В C++ 11 Поддержка Юникода расширена с помощью char16_t* char32_t* строковых типов и, а c++ 20 расширяет его до char8_t типа:

Источник

Как использовать строковый литерал в C++

Что такое строковый литерал. Смотреть фото Что такое строковый литерал. Смотреть картинку Что такое строковый литерал. Картинка про Что такое строковый литерал. Фото Что такое строковый литерал

На клавиатуре компьютера напечатаны символы. Когда вы нажимаете клавишу, вы видите символ на экране. Примечание: пробел — это тоже символ. Строковый литерал — это последовательность символов. В этой статье объясняется, как использовать строковые литералы C ++. Чтобы понять эту статью, вы должны знать о массивах и указателях C ++.

Символьный литерал

Символьный литерал — это символ в одинарных кавычках. Так,

char ident1 = ‘A’ ; char ident2 = ‘b’ ; char ident3 = ‘4’ ; char ident4 = ‘6’ ;

все разные определения персонажей. Обратите внимание, что цифра в одинарных кавычках — это символ, а не целое число.

Управляющая последовательность, такая как \ «(см. Ниже) в одинарных кавычках, является символом. Так,

Одиночный символ в двойных кавычках не является символом; это строка из одного символа. Таким образом, «A», «c» или «2» не являются символом, а представляют собой строку из одного символа каждый.

Переменную char можно переназначить позже в программе следующим образом:

Чтобы предотвратить изменение символа, присвоенного идентификатору, позже в программе, перед определением укажите зарезервированное слово const следующим образом:

Говорят, что переменная identity предназначена только для чтения.

Строковый литерал

Строковый литерал — это последовательность символов в двойных кавычках. Так,

char ident1 [ ] = «I love you» ; char ident2 [ ] = «I hate 3 of you» ; char ident3 [ ]
= «we are the world» ; char ident4 [ ] = «Hello World!» ;

все разные определения строковых литералов. Обратите внимание на использование двойных кавычек. Нет ничего лучше обычной переменной для строки. Строковый литерал — это массив символов, в котором вместо разделения с помощью <> последовательность разделяется знаком „«. Символы не разделяются запятыми. В квадратные скобки можно поместить любое число, превышающее количество символов в строковом литерале. Однако квадратные скобки лучше оставить пустыми.

Одиночный символ в двойных кавычках не является символом; это строка из одного символа. Таким образом, „A“, „c“ или „2“ — это не символ, а строка из одного символа каждый.

Строковая переменная не позволяет переназначать полный литерал позже в программе — см. Ниже. Однако отдельные символы могут быть переназначены — см. Ниже.

Одиночные и двойные кавычки в символах или буквах

Чтобы использовать одинарную кавычку в качестве символа, сделайте что-нибудь вроде,

Чтобы использовать двойные кавычки в качестве символа в строковом литерале, сделайте что-нибудь вроде:

Обратная косая черта используется в escape-последовательности, чтобы избежать конфликта с разделителями. Чтобы использовать двойные кавычки в качестве символа, не нужно использовать обратную косую черту: ’«’ — это нормально. Чтобы иметь одинарную кавычку в строковом литерале, не нужно использовать обратную косую черту: «ab’cd» — это нормально.

Поскольку обратная косая черта используется для экранирования символа, она должна быть экранирована другой обратной косой чертой при использовании в качестве символа или в строковом литерале.

Последовательность

Управляющая последовательность может быть одной из следующих:

Каждая escape-последовательность обычно вводится либо как символ в одинарных кавычках, либо как escape-последовательность в двойных кавычках.

Concatenation

По определению два строковых литерала можно соединить пробелом следующим образом:

Результат: abcdef. Это определение можно расширить до более чем двух литералов. Примечание: утверждение — это определение, а не просто присвоение. Определение может даже продолжаться до следующей строки с пробелом, разделяющим строки следующим образом:

Результатом будет abcdefghi.

Примечание. Символы не могут быть объединены таким образом, поскольку одинарные кавычки для символа не могут содержать более одного символа.

Операторы равенства

Одинаковые символы в одном регистре равны. Они не равны, если не принадлежат к одному и тому же делу. Рассматривать,

== означает равно, а = означает назначенный, а не равный. Выход 1 для истины. Рассматривать,

На выходе 0 для ложного. Рассматривать,

На выходе 0 для ложного. Рассматривать,

! = означает «не равно», а = означает «назначено» и «не равно». На выходе 0 для ложного. Рассматривать,

Выход 1 для истины. Рассматривать,

Выход 1 для истины.

Итак, == и! = — операторы равенства.

Операторы отношения

Для обычных символов в C ++ в возрастающем порядке числа идут перед прописными буквами, которые идут перед строчными буквами.

Строковый литерал как объект

Массив — это постоянный указатель на начало последовательности определенного типа данных. Точно так же строка — это постоянный указатель на начало последовательности символов. Сравните следующие определения:

Первый массив представляет собой массив целых чисел и состоит из пяти элементов. Второй и третий массивы — это массивы символов с разными именами, но с одинаковым количеством элементов. Второй и третий массивы одинаковы, но по своим именам. Текстовое содержимое второго массива ограничивается фигурными скобками; символы разделены запятыми, а каждый символ заключен в одинарные кавычки. Текстовое содержимое третьего массива ограничивается двойными кавычками; символы не разделяются запятыми, и каждый символ не находится в одинарных кавычках. Второй и третий массивы — это два способа создания строки, третий — лучший.

arr — это постоянный указатель на первый элемент своего массива, то есть arr всегда будет указывать на местоположение, имеющее целое число 3, даже если значение 3 изменилось. Размер массива, пять элементов, на самом деле не остается постоянным. Однако каждое из значений массива можно изменить.

str — это постоянный указатель на первый элемент своего массива, то есть str всегда будет указывать на место, имеющее символ «w», даже если значение «w» изменится. Размер символьного массива, состоящего из пяти элементов, на самом деле не остается постоянным. Однако каждое из значений литерала можно изменить.

stri — это постоянный указатель на первый элемент его литерала (массива), то есть stri всегда будет указывать на место с символом w, даже если значение w изменится. Размер строкового литерала (массива), состоящего из пяти элементов, на самом деле не остается постоянным. Однако каждое из значений литерала можно изменить.

Что является константой в массиве или строковом литерале? Адрес памяти первого элемента массива или литерала остается значением имени (идентификатора) массива или литерала и не может быть изменен. Ну, размер массива или литерала на самом деле не остается постоянным. Каждое значение в массиве или литерале можно изменить. Следующий код показывает, как был изменен четвертый элемент каждого из массивов:

arr [ 3 ] = 9 ;
str [ 3 ] = ‘e’ ;
stri [ 3 ] = ‘e’ ;

cout arr [ 3 ] ‘ \n ‘ ;
cout str ‘ \n ‘ ;
cout stri ‘ \n ‘ ;

9
womenwomen
женщин

Обратите внимание, что к элементам определенного строкового литерала, как и для третьего определения выше, можно получить доступ с помощью индекса массива (нижнего индекса). Причина второй строки вывода указана ниже.

Подстрочный индекс определения

Обратите внимание, что в приведенных выше определениях нет целого числа для нижнего индекса. Если число элементов не может быть легко определено программистом, целое число для нижнего индекса следует опустить. В любом случае целое число не должно быть меньше количества элементов в массиве.

Для строкового литерала целое число должно быть как минимум на 1 больше, чем количество символов в строке. Это связано с тем, что нулевой символ (\ 0) всегда добавляется компилятором в конец массива, который представляет собой строку, разделенную двойными кавычками. Нулевой символ не добавляется в конец второго массива выше, потому что это не официальная строка. Третий массив — официальная строка. В следующем коде показаны минимальные значения индекса.

Чтобы второе определение стало официальной строкой, необходимо добавить нулевой символ следующим образом:

Теперь вывод должен быть таким:

без вторых «женщин». Обратите внимание, что соответствующий индекс для второго массива — 6, а не 5, как было.

Постоянные буквальные значения

Чтобы предотвратить изменение любого символа в двойных кавычках, присвоенных идентификатору, позже в программе, перед определением укажите зарезервированное слово const, как показано ниже:

const char ident [ ] = «I love you» ;

Операции по обеспечению равенства

Операторы равенства: == и! =. При сравнении переменных (идентификаторов) двух строк сравниваются указатели (адреса) литералов; это не правильно. Для сравнения строк необходимо сравнить литералы, как в следующем коде:

bool result = «woman» == «woman» ;
cout result ‘ \n ‘ ;

Выход 1 для истины. Сравнение выполняется в словарной манере, но числа идут первыми в порядке возрастания, перед прописными буквами, которые идут перед строчными буквами. Результатом следующего кода является 0, если ложь.

Операторы отношения со строковыми литералами

Операторы отношения не работают со строковыми литералами.

Необработанный строковый литерал

Необработанный строковый литерал позволяет отображать строку как напечатанную, игнорируя escape-последовательности и учитывая символы новой строки. Рассмотрим следующий код:

char str [ ] = R «(abc \\ d efg hij
klmn \n « ‘ opq
rst)»;
cout \n ‘;

В коде необработанный строковый литерал начинается с R, за которым следуют „и“ (. Он заканчивается) и ».

Типы основных строковых литералов C ++

char

Тип char является исходным типом C ++ и обычно хранит символ в 8 битах.

char16_t

Это сохраняет символ в 16 битах.

char32_t

Это сохраняет символ в 32 бита.

wchar_t

char16_t и char32_t — широкие символы. wchar_t — это расширенный символ, который является проприетарным и определяется реализацией.

Заключение

Символьный литерал — это одиночный символ в одинарных кавычках. Управляющая последовательность — это символ, который также может быть заключен в одинарные кавычки. Строковый литерал — это последовательность символов в двойных кавычках. Строковый литерал — это массив символов, заканчивающихся на \ 0. Операторы равенства и отношения работают с символьными литералами. Операторы равенства работают со строковыми литералами, но операторы отношения не работают со строковыми литералами. Идентификаторы символов могут использоваться в сравнениях, но строковые идентификаторы не должны использоваться в сравнениях. Необработанный строковый литерал позволяет отображать строку как напечатанную, игнорируя escape-последовательности и соблюдая новые строки.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *