Подтвердить что ты не робот

Что означает \x в c/С++?

char arr[]= "\xeb\x2a";

BTW, те же:

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

4b9b3361

Ответ 1

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

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

Ответ 2

Как говорили другие, \x - это escape-последовательность, которая запускает "шестнадцатеричную escape-последовательность".

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

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

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

и

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

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

При использовании внутри набора двойных кавычек (") символы, указанные в 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 '
};

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

Ответ 3

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

BTW, те же:

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

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

Ответ 5

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

И я цитирую:

x Неподписанное шестнадцатеричное целое число

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

Ответ 6

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

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

Ответ 7

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

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