Что означает \ x в c / c ++? - PullRequest
37 голосов
/ 30 марта 2010
char arr[]= "\xeb\x2a";

Кстати, это одно и то же:

"\xeb\x2a" против '\xeb\x2a'

Ответы [ 7 ]

30 голосов
/ 30 марта 2010

\x указывает на экранирование шестнадцатеричного символа. Он используется для указания символов, которые нельзя ввести (например, ноль '\x00').

И "\xeb\x2a" является литеральной строкой (тип char *, 3 байта, заканчивается нулем), а '\xeb\x2a' является символьной константой (тип int, 2 байта, не заканчивается нулем, и это просто еще один способ написать 0xEB2A или 60202 или 0165452). Не то же самое:)

10 голосов
/ 30 марта 2010

Как уже говорили другие, \x - это escape-последовательность, которая запускает "hexadecimal-escape-sequence".

Некоторые дополнительные сведения из стандарта C99:

При использовании внутри набора одинарных кавычек (') символы являются частью "целочисленной символьной константы", которая (6.4.4.4/2 "Символьные константы"):

последовательность из одного или нескольких многобайтовых символов, заключенных в одинарные кавычки, как в 'x'.

и

Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы, содержащей один символ, который отображается на однобайтовый исполнительный символ, является числовым значением представления сопоставленного символа, интерпретируемого как целое число. Значение целочисленной символьной константы, содержащей более одного символа (например, 'ab'), или содержащей символ или escape-последовательность, которая не отображается на однобайтовый символ выполнения, определяется реализацией.

Итак, последовательность в вашем примере '\xeb\x2a' является значением, определяемым реализацией. Вероятно, это будет значение int 0xeb2a или 0x2aeb, в зависимости от того, является ли целевая платформа старшим или младшим порядком байтов, но вам нужно наверняка взглянуть на документацию своего компилятора.

При использовании внутри набора двойных кавычек (") символы, указанные в hex-escape-последовательности, являются частью строкового литерала с нулевым символом в конце.

Из стандарта C99 6.4.5 / 3 «Строковые литералы»:

Те же соображения применимы к каждому элементу последовательности в литерале символьной строки или литерале широкой строки, как если бы он был в целочисленной символьной константе или в символьной константе, за исключением того, что одиночная кавычка ' может быть представлена ​​либо сам по себе или с помощью escape-последовательности \', но двойная кавычка " должна быть представлена ​​escape-последовательностью \".


Дополнительная информация:

На мой взгляд, вам следует избегать использования «многосимвольных» констант. Есть только несколько ситуаций, в которых они предоставляют какое-либо значение по сравнению с использованием обычной старой постоянной int. Например, '\xeb\x2a' может быть более переносимым, может быть указано как 0xeb2a или 0x2aeb в зависимости от того, какое значение вы действительно хотите.

Одна область, в которой я нашел полезными многосимвольные константы, - это поиск умных значений enum, которые можно распознать в отладчике или дампе памяти:

enum CommandId {
    CMD_ID_READ  = 'read',
    CMD_ID_WRITE = 'writ',
    CMD_ID_DEL   = 'del ',
    CMD_ID_FOO   = 'foo '
};

Существует несколько проблем с переносимостью (кроме платформ с маленькими целочисленными значениями или предупреждениями, которые могут быть выброшены). Независимо от того, попадают ли символы в значения перечисления в форме с прямым или младшим порядком байтов, код все равно будет работать (если только вы не выполняете какие-то еще действия со значениями перечисления). Если символы заканчиваются в значении с использованием порядка байтов, который не соответствует ожидаемому, это может сделать значения менее удобными для чтения в отладчике, но на «правильность» это не повлияет.

2 голосов
/ 30 марта 2010

Когда вы говорите:

Кстати, это одно и то же:

"\ xeb \ x2a" vs '\ xeb \ x2a' ​​

На самом деле это не так. Первый создает символьный строковый литерал, заканчивающийся нулевым байтом, содержащий два символа, которые вы предоставляете в шестнадцатеричном представлении. Второй создает целочисленную константу.

1 голос
/ 30 марта 2010

\ x позволяет указать символ в шестнадцатеричном коде.

Это позволяет вам указать символы, которые обычно не печатаются (некоторые из них имеют предопределенные специальные escape-последовательности, такие как '\ n' = newline и '\ t' = tab '\ b' = bell)

1 голос
/ 30 марта 2010

\x означает, что это экранирование шестнадцатеричного символа. Таким образом, \xeb будет означать символ eb в шестнадцатеричном формате или 235 в десятичном виде. См. http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx для получения информации о руде.

Что касается второго, нет, они не одинаковы. Двойные кавычки, ", означают, что это строка символов, массив символов с нулем в конце, тогда как одинарные кавычки, ', означают, что это один символ, байт, который символ представляет.

1 голос
/ 30 марта 2010

Вы могли бы гуглить это. Полезный сайт здесь .

И я цитирую:

x Шестнадцатеричное целое без знака

Таким образом, ваше \xeb будет равно 235. В десятичном виде.

1 голос
/ 30 марта 2010

Это специальный символ, который указывает, что строка на самом деле является шестнадцатеричным числом.

http://www.austincc.edu/rickster/COSC1320/handouts/escchar.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...