Является & quot; ‘& quot; идентичен & quot; \ ‘& quot; согласно стандарту C / C ++?

int main()
{
char* str1 = "Tom's cat";
char* str2 = "Tom\'s cat";
}

Код может быть скомпилирован с VS 2015.

Мне просто интересно:

Оба эти способа совместимы со стандартами C и / или C ++?

5

Решение

От C++11 ISO Standard

§ 2.14.5 Строковые литералы [Lex.string]

15 Escape-последовательности и имена универсальных символов в неочищенных строковых литералах имеют то же значение, что и в символьных литералах (2.14.3), за исключением того, что одинарная кавычка ’может быть представлена ​​либо сама по себе, либо с помощью escape
последовательность \ ’

6

Другие решения

Да, внутри строкового литерала оба одинаковы.

Экранированная версия требуется для символьного литерала:

char x = '\'';

Стандартные ссылки — два источника. Во-первых, этапы перевода. Из C.11 §5.1.1.2 (C ++. 11 [lex.phases] имеет похожий язык):

  1. Каждый элемент исходного набора символов и 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-последовательностью \",

4

\' является допустимой escape-последовательностью символов в C и C ++. Следовательно, линии

char* str1 = "Tom's cat";
char* str2 = "Tom\'s cat";

производить эквивалентные строковые литералы, как на C, так и на C ++.

2

Да, они идентичны.

Из стандарта 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
2
По вопросам рекламы [email protected]