количество цифр в шестнадцатеричном escape-коде в C / C ++ - PullRequest
16 голосов
/ 29 апреля 2010

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

char* a = "\x000aaxz";

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

Кто здесь?

Ответы [ 3 ]

30 голосов
/ 29 апреля 2010

§2.13.2 / 4:

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

Она права.

Однако вы можете прекратить его досрочно путем нетерпеливого объединения: последовательность литералов "\x000a" "axz" определяет один строковый литерал из четырех символов. (2.13.4 / 3) * * 1 010

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

4 голосов
/ 29 апреля 2010

Цитата из MSDN на символьные константы C ++:

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

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

1 голос
/ 03 августа 2012

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

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

Так что да, она права.

...