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

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

BTW, они то же:

"\xeb\x2a" по сравнению с '\xeb\x2a'

38
задан user198729 30 March 2010 в 17:47
поделиться

7 ответов

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

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

32
ответ дан 27 November 2019 в 03:50
поделиться

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

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

{{ 1}}
1
ответ дан 27 November 2019 в 03:50
поделиться

Как уже говорили другие, \ 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 или предупреждения, которые могут быть извергнуты). Независимо от того, попадают ли символы в значения перечисления в форме прямого или обратного порядка байтов, код все равно будет работать (если только вы не сделаете что-то еще нечестивое со значениями перечисления). Если символы попадают в значение с порядком байтов, который не соответствует вашим ожиданиям, это может сделать значения менее удобными для чтения в отладчике, но это не повлияет на «правильность».

10
ответ дан 27 November 2019 в 03:50
поделиться

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

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

1
ответ дан 27 November 2019 в 03:50
поделиться

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

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

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

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

2
ответ дан 27 November 2019 в 03:50
поделиться

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

И я цитирую:

x Беззнаковое шестнадцатеричное целое число

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

1
ответ дан 27 November 2019 в 03:50
поделиться

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

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

1
ответ дан 27 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: