int main()
{
char* str1 = "Tom's cat";
char* str2 = "Tom\'s cat";
}
Код может быть скомпилирован с VS 2015.
Мне просто интересно:
Оба эти способа совместимы со стандартами C и / или C ++?
От C++11 ISO Standard
§ 2.14.5 Строковые литералы [Lex.string]
…
15 Escape-последовательности и имена универсальных символов в неочищенных строковых литералах имеют то же значение, что и в символьных литералах (2.14.3), за исключением того, что одинарная кавычка ’может быть представлена либо сама по себе, либо с помощью escape
последовательность \ ’
Да, внутри строкового литерала оба одинаковы.
Экранированная версия требуется для символьного литерала:
char x = '\'';
Стандартные ссылки — два источника. Во-первых, этапы перевода. Из C.11 §5.1.1.2 (C ++. 11 [lex.phases] имеет похожий язык):
- Каждый элемент исходного набора символов и escape-последовательность в символьных константах и строковых литералах преобразуются в соответствующий элемент набора символов выполнения; если соответствующего члена нет, он преобразуется в определенный пользователем элемент, отличный от нулевого (широкого) символа.
Далее идет определение грамматики для символьной константы и для строковых литералов, которые допускают escape-последовательности. А также простой побег последовательности является escape-последовательностью в грамматике. C.11 §6.4.4.4 определяет его (C ++. 11 [lex.ccon] имеет такое же определение):
простой побег последовательности: один из
\' \" \? \\ \a \b \f \n \r \t \v
Наконец, для строковых литералов стандарт определяет, что интерпретация символов в литерале такая же, как если бы каждый был символьной константой, а затем делает исключение из '
, Из C.11 §6.4.5 (C ++. 11 [lex.string] имеет похожий язык):
Те же соображения применимы к каждому элементу последовательности в строковом литерале, как если бы он
были в целочисленной символьной константе (для символа или строкового литерала UTF-8) или в широкой
символьная константа (для широкого строкового литерала), за исключением того, что одиночная кавычка'
является
может быть представлен как сам по себе, так и с помощью escape-последовательности\'
, но двойная кавычка «должна быть представлена escape-последовательностью\"
,
\'
является допустимой escape-последовательностью символов в C и C ++. Следовательно, линии
char* str1 = "Tom's cat";
char* str2 = "Tom\'s cat";
производить эквивалентные строковые литералы, как на C, так и на C ++.
Да, они идентичны.
Из стандарта c ++, $ 2.13.3 / 7 Символьные литералы [lex.ccon]
Таблица 6 — Escape-последовательности
new-line NL(LF) \n horizontal tab HT \t vertical tab VT \v backspace BS \b carriage return CR \r form feed FF \f alert BEL \a backslash \ \\ question mark ? \? single quote ’ \’ double quote " \"octal number ooo \ooo hex number hhh \xhhh