#c #syntax #escaping #char
#c #синтаксис #экранирование #символ
Вопрос:
Я читал похожее на это обсуждение здесь на SO на прошлой неделе, и теперь у меня проблема, я не могу найти эту тему.
Мне нужно назначить символ двойной кавычки » переменной типа wchar_t
, которую я использую
wchar_t atest = '"';
wchar_t atest2 = '"';
В отладчике VS atest
отображается как 34 L'"'
(теперь я вижу, где кавычки разделяются) и atest2
есть 38 L'amp;'
. Я понимаю, что использовать сейчас, но не почему. Что происходит, когда я создаю atest2
?
Комментарии:
1. Второй
34 L'"'
для меня (MSVC 2010)2. Дох! Извините, я смотрел на другую сравниваемую переменную! Вы правы, я ошибаюсь.
3. Возможно, вы захотите написать
L'"'
илиL'"'
, так что это явно типwchar_t
. На самом деле в этом нет необходимости, посколькуchar
значение будет повышено.4. @John: Вы приняли неправильный ответ.
Ответ №1:
wchar_t atest = '"';
wchar_t atest2 = '"';
Эти два эквивалентны.
Некоторые символы должны экранироваться в символьных литералах, включая
его самого, поэтому используется символ обратной косой черты '\'
.
Символ, заключенный в двойные кавычки, необязательно может быть экранирован. Предположительно, это для согласованности со строковыми литералами, где они должны экранироваться. Аналогично, символ, заключенный в одинарные кавычки, должен экранироваться в символьных литералах и может экранироваться в строковых литералах.
(Нет, '"'
не является многосимвольной константой.)
Ответ №2:
У вас есть многосимвольная константа. Они разрешены в соответствии со спецификациями C ( ), но их интерпретация определяется реализацией. Немного подробностей см. в MSDN, но вкратце: не делайте этого.
Комментарии:
1. Нет,
'"'
это не многосимвольная константа. Смотрите мой ответ и раздел 2.13.2 стандарта C 2003 года.2. @Keith: Да, вы правы, я вспомнил, что « не используется для неэкран-последовательностей после того, как я написал этот ответ. Ну что ж.