char arr[]= "\xeb\x2a";
BTW, они то же:
"\xeb\x2a"
по сравнению с '\xeb\x2a'
\ x
указывает на экранирование шестнадцатеричного символа. Он используется для указания символов, которые нельзя вводить (например, null '\ x00'
).
И «\ xeb \ x2a»
- это буквальная строка (тип - char *
, 3 байта, с завершающим нулем) и '\ xeb \ x2a'
- символьная константа (тип - int
, 2 байта, не завершается нулем, и это просто еще один способ записи 0xEB2A, 60202 или 0165452). Не то же самое :)
\ x позволяет вам указать символ по его шестнадцатеричному коду.
Это позволяет вам указывать символы, которые обычно не печатаются (для некоторых из них предопределены специальные escape-последовательности, такие как '\ n' = новая строка и '\ t' = tab '\ b' = звонок)
{{ 1}} Как уже говорили другие, \ x
- это escape-последовательность, которая запускает «шестнадцатеричную escape-последовательность».
Некоторые дополнительные сведения из стандарта C99:
При использовании внутри набора одинарных кавычек ( '
) символы являются частью «целочисленной символьной константы», которая (6.4.4.4/) 2 «Символьные константы»):
последовательность из одного или нескольких многобайтовых символов, заключенных в одинарные кавычки, как в
'x'
.
и
Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы, содержащей один символ, который сопоставляется с однобайтовым символом выполнения, является числовым значением представления сопоставленного символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей более одного символа (например,
'ab'
) или содержащую символ или escape-последовательность, которая не отображается на однобайтовый символ выполнения, определяется реализацией.
Таким образом, последовательность в вашем примере '\ xeb \ x2a'
является значением, определяемым реализацией. Скорее всего, это будет значение типа int 0xeb2a
или 0x2aeb
, в зависимости от того, является ли целевая платформа прямым или прямым порядком байтов, но вам нужно будет посмотреть документацию вашего компилятора, чтобы знать для некоторых.
При использовании внутри набора двойных кавычек ( "
) символы, указанные в шестнадцатеричной escape-последовательности, являются частью строкового литерала с завершающим нулем.
Из стандарта 6.4.5/3 «Строковые литералы»:
Те же соображения применяются к каждому элементу последовательности в символьном строковом литерале или широком строковом литерале, как если бы он был в константе целого символа или константе широкого символа, за исключением того, что одиночный -quote
'
может быть представлен либо сам по себе, либо с помощью escape-последовательности\'
, но двойные кавычки«
должны быть представлены escape-последовательностью\ "
.
Дополнительная информация:
На мой взгляд, вам следует избегать использования "многосимвольных" констант. Лишь в нескольких ситуациях они предоставляют какое-либо значение по сравнению с использованием обычной старой константы int
. Например, '\ xeb \ x2a'
более переносимо можно указать как 0xeb2a
или 0x2aeb
в зависимости от того, какое значение вы действительно хотите.
Одной из областей, в которой я обнаружил, что многосимвольные константы могут быть полезны, является создание умных значений перечисления, которые можно распознать в отладчике или дампе памяти:
enum CommandId {
CMD_ID_READ = 'read',
CMD_ID_WRITE = 'writ',
CMD_ID_DEL = 'del ',
CMD_ID_FOO = 'foo '
};
Есть несколько проблем с переносимостью вышеупомянутых ( кроме платформ, у которых есть небольшие int или предупреждения, которые могут быть извергнуты). Независимо от того, попадают ли символы в значения перечисления в форме прямого или обратного порядка байтов, код все равно будет работать (если только вы не сделаете что-то еще нечестивое со значениями перечисления). Если символы попадают в значение с порядком байтов, который не соответствует вашим ожиданиям, это может сделать значения менее удобными для чтения в отладчике, но это не повлияет на «правильность».
Это специальный символ, который указывает, что строка на самом деле является шестнадцатеричным числом.
http://www.austincc.edu/rickster/COSC1320/handouts/escchar.htm
Когда вы говорите:
Кстати, это одно и то же:
"\ xeb \ x2a" vs '\ xeb \ x2a'
На самом деле это не так. Первый создает символьный строковый литерал, оканчивающийся нулевым байтом, содержащий два символа в шестнадцатеричном представлении, которое вы предоставляете. Второй создает целочисленную константу.
Вы могли бы погуглить. Полезный сайт здесь.
И я цитирую:
x Беззнаковое шестнадцатеричное целое число
Таким образом, ваш \xeb
похож на 235 в десятичных дробях.
\ x
означает, что это экранирование шестнадцатеричного символа. Таким образом, \ xeb
будет означать символ eb
в шестнадцатеричном формате или 235
в десятичном формате. См. http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx для получения информации о руде.
Что касается второго, то нет, они не совпадают. Двойные кавычки, "
, означают, что это строка символов, массив символов с завершающим нулем, тогда как одинарная кавычка, '
, означает, что это одиночный символ, байт этого символа. представляет.