Используя C, я прав, думая, что литералы, начинающиеся с нескольких нулей, считаются восьмеричными?

В следующем коде C используются восьмеричные литералы для всех этих определений? Даже если они начинаются с нескольких нулей?

#define TCL_REG_BASIC       000000  /* BREs (convenience). */
#define TCL_REG_EXTENDED    000001  /* EREs. */
#define TCL_REG_ADVF        000002  /* Advanced features in EREs. */
#define TCL_REG_ADVANCED    000003  /* AREs (which are also EREs). */
#define TCL_REG_QUOTE       000004  /* No special characters, none. */
#define TCL_REG_NOCASE      000010  /* Ignore case. */
#define TCL_REG_NOSUB       000020  /* Don't care about subexpressions. */
#define TCL_REG_EXPANDED    000040  /* Expanded format, white space & comments. */
#define TCL_REG_NLSTOP      000100  /* \n doesn't match . or [^ ] */
#define TCL_REG_NLANCH      000200  /* ^ matches after \n, $ before. */
#define TCL_REG_NEWLINE     000300  /* Newlines are line terminators. */
#define TCL_REG_CANMATCH    001000  /* Report details on partial/limited * matches. */

person Gary Willoughby    schedule 16.12.2013    source источник
comment
Да, это правильно, хотя он принимает только один начальный ноль.   -  person doynax    schedule 17.12.2013
comment
особенно если они начинаются с нескольких нулей ;) (шестнадцатеричные литералы начинаются с 0x)   -  person Tim Seguine    schedule 17.12.2013
comment
Мне просто интересно, почему так много ведущих нулей, лол.   -  person Gary Willoughby    schedule 17.12.2013
comment
Вероятно, автор пытается намекнуть на ширину битового поля. И хочет, чтобы все они красиво выстроились   -  person Tim Seguine    schedule 17.12.2013
comment
Что сказал Тим. Такие вещи довольно стандартны (используются повсеместно в заголовках Windows).   -  person Taylor Brandstetter    schedule 17.12.2013
comment
Идея для эзотерического языка программирования: сделать числа с одним ведущим нулем восьмеричным, двумя ведущими нулями снова десятичными, тремя ведущими нулями дюжинными, четырьмя ведущими нулями с основанием 14, пятью ведущими нулями шестнадцатеричными и т. д.   -  person dan04    schedule 17.12.2013


Ответы (4)


Из стандарта C, 6.4.4.1, параграф 3:

Восьмеричная константа состоит из префикса 0, за которым может следовать последовательность цифр только от 0 до 7.

person Taylor Brandstetter    schedule 16.12.2013
comment
Когда я отправил свой ответ, твоего здесь не было! - person haccks; 17.12.2013
comment
@hackks Я удалил его, когда увидел, что paulsm4 уже ответил, но потом кто-то попросил меня добавить его обратно... Извините за путаницу. :П - person Taylor Brandstetter; 17.12.2013

Да, ты прав.

C11, 6.4.4.1 Целочисленные константы:

Восьмеричная константа состоит из префикса 0, за которым может следовать только последовательность цифр от 0 до 7.

person haccks    schedule 16.12.2013
comment
Из любопытства, что запрещает десятичные литералы с ведущими нулями? Например. 08 является синтаксической ошибкой в ​​отношении GCC и MSVC. - person doynax; 17.12.2013
comment
@дойнакс; С каких пор 8 приходит к восьмеричному представлению числа? И почему компилятор не должен выдавать предупреждение? Я предлагаю вам прочитать систему счисления. - person haccks; 17.12.2013
comment
Мне было просто любопытно, каким может быть правило, определяющее 08 как недопустимое восьмеричное число, а не правильный десятичный литерал, поскольку у вас, похоже, был удобный стандарт. Никакой реальной причины, просто внутренний юрист во мне хочет найти дыры в любых формальных определениях. - person doynax; 17.12.2013
comment
@doynax тот же раздел 6.4.4.1 стандарта конкретно определяет десятичную константу как начинающуюся с ненулевой десятичной цифры. - person Nigel Harper; 17.12.2013
comment
@Найджел Харпер: Черт. И я предполагаю, что последовательность цифр 0-7 здесь может быть пустой, таким образом покрывая случай 0 как (очень распространенный) восьмеричный литерал - person doynax; 17.12.2013
comment
Меня злит голосование против без каких-либо объяснений/комментариев. Это трусость. - person haccks; 17.12.2013
comment
@doynax Точно - необязательный бит в стандартной кавычке означает, что чистый 0 технически является допустимой восьмеричной константой. - person Nigel Harper; 17.12.2013
comment
@дойнакс; Вот полный параграф: A decimal constant begins with a nonzero digit and consists of a sequence of decimal digits. An octal constant consists of the prefix 0 optionally followed by a sequence of the digits 0 through 7 only. A hexadecimal constant consists of the prefix 0x or 0X followed by a sequence of the decimal digits and the letters a (or A) through f (or F) with values 10 through 15 respectively. Который ясно показывает, что десятичное число не может начинаться с 0. Продолжение........ - person haccks; 17.12.2013
comment
comment
@hackks: Действительно, и Найджел согласен. К счастью, восьмеричные числа не имеют других свойств по сравнению с десятичными (кроме беззнакового продвижения) и, таким образом, в этом случае неразличимы, насколько я могу судить. - person doynax; 17.12.2013
comment
@дойнакс; Я прокомментировал ваш комментарий:I was just curious what the rule identifying 08 as an invalid octal number rather than a proper decimal literal might be since you seemed to have the standard handy. No real reason, just the inner lawyer in me wanting to pick holes in any formal definitions - person haccks; 17.12.2013

да.

http://www.cplusplus.com/doc/tutorial/constants/

В дополнение к десятичным числам (те, которые большинство из нас использует каждый день), C++ позволяет использовать восьмеричные числа (основание 8) и шестнадцатеричные числа (основание 16) в качестве литеральных констант. Для восьмеричных литералов цифрам предшествует символ 0 (ноль). А для шестнадцатеричных им предшествуют символы 0x (ноль, x). Например, следующие литеральные константы эквивалентны друг другу:

75         // decimal
0113       // octal
0x4b       // hexadecimal  
person paulsm4    schedule 16.12.2013
comment
Технически вопрос касается C, но, к счастью, C и C++ в этом отношении одинаковы. - person Taylor Brandstetter; 17.12.2013

Все примеры OP восьмеричные, так как они начинаются с 0. Множественные начальные нули или наличие 8 или 9 не меняют его от восьмеричного. 8 или 9 должны привести к ошибке.


К вашему сведению: некоторые дополнительные вхождения (хотя, возможно, и не буквальные) в C, где встречается десятичная, восьмеричная и шестнадцатеричная интерпретация.

Хотя это и не литерал, в строке формата для printf() спецификаторы, такие как "%016llx", представляют собой не восьмеричное значение ширины 016, а флаг '0' и десятичное значение 16.

С printf() вывод с использованием спецификатора "%a" имеет вид «[−]0xh.hhhh p±d», где мантиссы представлены в шестнадцатеричном формате, а показатель степени — в десятичном.

В управляющих последовательностях нет десятичной спецификации. Ниже приведены некоторые образцы:

\' \" \? \\ \a \b \f \n \r \t \v
\0   (octal)
\01   (octal)
\012   (octal)
\0123   (bad - only up to 3)
\x0 (hexadecimal)
\x01 (hexadecimal)
\x012 (hexadecimal)
\x0123 (hexadecimal)
\x01234… (hexadecimal)
\u1234 (hexadecimal)
\U00012345 (hexadecimal)
person chux - Reinstate Monica    schedule 16.12.2013