Количество цифр в шестнадцатеричном escape-коде в C/С++

У меня спор с моим коллегой. Она говорит, что следующее:

char* a = "\x000aaxz";

будет/может рассматриваться компилятором как "\ x000aa". Я не согласен с ней, так как я думаю, что после \x вы можете иметь максимум 4 шестнадцатеричных символа. Можете ли вы иметь более 4 шестнадцатеричных символов?

Кто здесь?

Ответы

Ответ 1

§2.13.2/4:

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

Она права.

Тем не менее, вы можете закончить его с помощью нетерпеливой привязки: последовательность литералов "\x000a" "axz" указывает единственный четырехсимвольный строковый литерал. (2.13.4/3)

Также обратите внимание, что Unicode использует 21-битные кодовые точки; он не останавливается на 16 бит.

Ответ 2

Цитата из MSDN на константах символов С++:

Октальные escape-последовательности, указанные в форме \ooo, состоят из обратного слэша и одного, двух или трех восьмеричных символов. Шестнадцатеричные escape-последовательности, указанные в форме \xhhh, состоят из символов \x, за которыми следует последовательность шестнадцатеричных цифр. В отличие от восьмеричных escape-констант, нет предела количеству шестнадцатеричных цифр в escape-последовательности.

from http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx

Ответ 3

ну, в этом отношении, шестнадцатеричная escape-последовательность заканчивается с шестнадцатеричным символом, например, \x0abc9k равен 0abc9 в шестнадцатеричном виде, а затем 'k' поэтому, чтобы закончить шестнадцатеричную последовательность, вам придется дважды использовать двойные кавычки в конце например \x0ab "" c9k, который принимает только 0ab как hex

или поочередно вы можете использовать восьмеричную escape-последовательность, поскольку в восьмеричной escape-последовательности есть предел числам, поэтому в нем должно быть максимум три восьмеричные цифры. например \o1234 - это 123 в восьмеричном, а затем "4"

Итак, да, она права.