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

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

ВНИМАНИЕ! Вопросы по существу обсуждаемого вопроса просьба задавать здесь или создать тему на форуме и кинуть на неё ссылку в блог или мне в личку.

Причин для этого несколько.

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

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

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

Исторически сложилось, что раньше (когда ещё не было блога) статьи располагались на форуме и представлены были в виде двух тем. Первая тема создавалась в специально отведённой свалке и представляла собой черновик, который со временем дорабатывался до законченной статьи. После этого статья переезжала во вторую тему в тематическом разделе. А первая тема оставалась дополнительной свалкой для замечаний и мелких вопросов по теме. Ссылку на старое местоположение данной свалки я помещаю в начале статьи. Вопросы, по возможности, прошу создавать в отдельных темах, но если вопрос действительно мелкий, то можно его задать и в указанной свалке.

Семантика строкового литерала в языках C/C++ имеет двоякий смыл и зависит от того, в каком месте кода он (строковой литерал) встретился. И эти два различных случая отражены в вышеидущем примере.

2. Строковой литерал на позиции инициализатора массива char’ов

ВНИМАНИЕ!
В первом комментарии к статье мне любезно сообщили об ошибке. Поведение для Си и для Си++ немного различается. А потому нижеидущий текст (до конца раздела 2) гарантированно справедлив для языка Си, но требует небольшой доработки для языка Си++

При этом есть один очень хитрый момент, касающийся включения в этот инициализатор элемента ‘\0’. И этот момент иногда вводит в заблуждение даже тех, кто имеет хороший опыт программирования. Если массив задан без указания размера (т.е. с пустыми квадратными скобками), то в инициализатор включается хвостовой символ ‘\0’, как это было указано в вышеидущем примере. Т.е., условно говоря, sizeof от инициализатора (и, соответственно, переменной типа массив) будет равен количеству символов в строке плюс единица. Однако если у массива указан размер, то хвостовой ‘\0’ в инициализатор НЕ включается.

Таким образом, если мы напишем

то такая запись будет эквивалентной

По общим правилам языков C/C++ для инициализации массива в случаях, когда инициализатор имеет меньшее число элементов, чем инициализируемая переменная, хвост инициализатора дописывается нулями соответствующего типа. И в данном случае такую запись можно трактовать как

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

Если мы напишем такой пример:

то при исполнении на многих компиляторах мы получим код, который при исполнении напечатает нам «abcdefghi». Связано это с тем, что компилятор, как правило, положит три массива «a», «b» и «c» в память подряд друг за другом и таким образом в памяти сформируется набор данных размером 10 байт: ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘\0’. Когда мы подаём в printf указатель на массив «a», то внутри себя функция printf уже не знает ни о каких переменных и будет работать с этим указателем как со строкой: т.е. с набором символов, который заканчивается нулём.

является ошибочной, потому как размер инициализатора больше, чем размер массива.

В случае с инициализацией многомерных массивов char’ов имеем всё ровно то же самое:

Источник

BestProg

Литералы

Содержание

Поиск на других ресурсах:

Литералы – это постоянные значения, которые представляются в удобной для восприятия форме.

2. Какого типа могут быть литералы?

Литералы могут быть любого простого типа. Представление любого литерала зависит от конкретного типа.

В зависимости от значения литералы могут быть:

3. Как представляются целочисленные литералы?

По умолчанию, все целочисленные литералы имеют тип int :

Примеры литералов типа int :

Для того чтобы литерал имел тип long к нему нужно добавить суффикс ‘ l ‘ или ‘ L ‘. Примеры литералов типа long :

Для того чтобы литерал имел беззнаковый целочисленный тип к нему нужно добавить суффикс ‘ u ‘ или ‘ U ‘. Примеры литералов типа uint :

Примеры литералов типа ulong :

Можно, но при условии, что присваиваемое значение может быть представлено целочисленным типом.

Пример:

5. Каким образом представляются литералы, принадлежащие к типам с плавающей запятой?

Примеры литералов типа double :

Пример описания и присвоения значения литералов переменным, которые принадлежат к типам с плавающей запятой:

7. Как представляются значения целочисленных литералов в шестнадцатеричной системе исчисления?

Язык C# разрешает также представлять целочисленные литералы в шестнадцатеричной системе исчисления. Шестнадцатеричные литералы должны начинаться с символов « 0x «.

Примеры представления литералов в шестнадцатеричной системе исчисления:

8. Как представляются символьные литералы ( char )?

Примеры символьных литералов:

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

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

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

9. Как представляются строчные литералы?

В языке C# строчный литерал представляет собой набор символов, взятых в двойные кавычки. Примеры строчных литералов

Если нужно задать в виде литерала следующий путь:

то он будет иметь такой вид:

Пример описания переменной типа строчный литерал, в которой задается путь к файлу:

10. Какой вид имеет буквальный строчный литерал?

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

Например:

В буквальный строчный литерал можно включить управляющие символы (табуляция, новая строка и т.п.) не применяя управляющие последовательности.

Источник

Строковые и символьные литералы (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 не будет опубликован. Обязательные поля помечены *