Как экранировать символы при назначении типа char (не String) в C

#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: Да, вы правы, я вспомнил, что « не используется для неэкран-последовательностей после того, как я написал этот ответ. Ну что ж.