Строкові і символьні літерали (c)

Блок, що відноситься тільки до систем Microsoft

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

Вісімкова escape-послідовність - це зворотна коса риса, за якою слідує послідовність вісімкових цифр (не більше трьох). Вісімкова escape-послідовність, яка містить більше трьох цифр, обробляється як восьмерична послідовність з трьох цифр, за якою слідують цифри, що позначають символи. Це може призводити до несподіваних результатів. приклад:

Якщо розширений символьний літерал з префіксом L містить більше одного символу, значення береться з першого символу. Наступні символи ігноруються, на відміну від поведінки еквівалентного звичайного символьного литерала без префікса.

За допомогою універсальних імен символів можна закодувати значення в діапазоні сурогатних кодових точок D800-DFFF. Для сурогатних пар Юникода вкажіть універсальне ім'я символу, використовуючи \ UNNNNNNNN. де NNNNNNNN - восьмизначна кодова точка для символу. При необхідності компілятор створить сурогатну пару.

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

Строковий літерал являє послідовність символів, які разом утворюють рядок із завершальним нулем. Символи повинні бути укладені в подвійні лапки. Існують наступні типи строкових літералів.

Вузькі рядкові літерали

Звичайний рядковий літерал являє собою завершується нулем обмежений подвійними лапками масив типу const char [n] без префікса, де n - довжина масиву в байтах. Звичайний рядковий літерал може містити будь-які графічні символи, за винятком подвійних лапок ( "), зворотної косої риски (\) або символу нового рядка. Звичайний рядковий літерал також може містити перелічені вище escape-послідовності і універсальні імена символів, які поміщаються в байті.

Рядки в кодуванні UTF-8

Рядок в кодуванні UTF-8 являє собою завершується нулем обмежений подвійними лапками масив типу const char [n] з префіксом u8, де n - довжина закодованого масиву в байтах. Строковий літерал з префіксом u8 може містити будь-які графічні символи, за винятком подвійних лапок ( "), зворотної косої риски (\) або символу нового рядка. Строковий літерал з префіксом u8 може також містити перелічені вище escape-послідовності і будь-які універсальні імена символів.

Розширені рядкові літерали

Розширений строковий літерал - це завершується нулем масив констант wchar_t. що починається з префікса L. В цей масив можуть входити будь-які графічні символи, за винятком подвійних лапок ( "), зворотної косої риски (\) і символу нового рядка. Розширений строковий літерал може містити перелічені вище escape-послідовності і будь-які універсальні імена символів.

Необроблені рядкові літерали (C ++ 11)

Необроблений строковий літерал - це завершується нульовим значенням масив символів будь-якого типу, в який можуть входити будь-які графічні символи, включаючи подвійні лапки ( "), зворотну косу риску (\) і символ нового рядка. Необроблені рядкові літерали часто застосовуються в регулярних виразах, які використовують класи символів, а також в рядках HTML і XML. Приклади см. в наступній статті: Bjarne Stroustrup's FAQ on C ++ 11 (Питання і відповіді про C ++ 11 від Бйорна Страуструпа).

Роздільник - це містить до 16 символів для користувача послідовність, яка стоїть безпосередньо перед відкриває круглою дужкою і відразу після закриває круглої дужки необробленого строкового літерала. Наприклад, в R "abc (Hello" \ () abc "послідовність роздільників - abc. А вміст рядка - Hello" \ (. Роздільники можна використовувати для розрізнення необроблених рядків, що містять подвійні лапки і дужки. Наступний рядок призводить до помилки компілятора:

Літерали std :: string (C ++ 14)

Літерали std :: string є реалізацією користувальницьких литералов на основі стандартної бібліотеки (див. Нижче) і виходять шляхом додавання префікса "xyx" s (разом з суфіксом s). Цей тип строкових літералів створює тимчасові об'єкти типу std :: string, std :: wstring, std :: u32string або std :: u16string, в залежності від зазначеного префікса. Якщо префікс не використовується, як показано вище, створюється об'єкт типу std :: string. Якщо використовується префікс L "xyz" s, створюється об'єкт типу std :: wstring. При використанні префікса u "xyz" s створюється об'єкт типу std :: u16string. а префікса U "xyz" s - об'єкт типу std :: u32string.

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

Максимальна довжина строкового літерала - 65535 байт. Це обмеження може бути застосовано як до вузьких, так і до розширених строкових літералів.

Зміна строкових літералів

Оскільки рядкові літерали є константи (крім літералів std: string), спроби їх зміни (приклад: str [2] = 'A') ведуть до помилки компілятора.

Блок, що відноситься тільки до систем Microsoft

В Visual C ++ строковий літерал можна використовувати для ініціалізації покажчика не є сталою значенням типу char або wchar_t. Це дозволено в коді C99, але не рекомендується в С ++ 98 і видалено з С ++ 11. Спроба змінити рядок викличе порушення прав доступу, як показано в наступному прикладі:

Щоб вказати компілятору видавати помилку при перетворенні строкового літерала в символ покажчика non_const, можна задати параметр компілятора / Zc: strictStrings (відключення перетворення типів строкових літералів). Рекомендується використовувати його для створення стерпного коду, відповідного стандартам. Крім того, рекомендується оголошувати ініціалізіруемих строковим літералом покажчики за допомогою ключового слова auto. Таким чином відбувається перетворення в правильний тип (const). У наступному прикладі коду перехоплюється під час компіляції спроба записати в строковий літерал:

Зчеплення суміжних строкових літералів