Является ли 0 десятичным или восьмеричным литералом? - PullRequest
321 голосов
/ 01 августа 2011

Ноль всегда равен нулю, поэтому это не имеет значения.Но в недавней дискуссии с моим другом он сказал, что восьмеричные литералы сегодня почти не используются.Затем до меня дошло, что на самом деле почти все целочисленные литералы в моем коде являются восьмеричными, а именно 0.

является 0 восьмеричным литералом согласноC ++ грамматика?Что говорит стандарт?

Ответы [ 3 ]

289 голосов
/ 01 августа 2011

Да, 0 - это Восьмеричный литерал в C ++.

Согласно стандарту C ++:

2.14.2 Целочисленные литералы [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit
44 голосов
/ 01 августа 2011

Любое целочисленное значение с префиксом 0 является восьмеричным значением. Т.е.: 01 - восьмеричное 1, 010 - восьмеричное 10, которое является десятичным 8, и 0 - восьмеричное 0 (которое является десятичным, и любое другое, 0).

Так что да, «0» является восьмеричным.

Это простой английский перевод фрагмента грамматики в ответе @ Als: -)


Целое число с префиксом 0x это , а не с префиксом 0. 0x - это явно другой префикс. По-видимому, есть люди, которые не могут сделать это различие.

В соответствии с тем же стандартом, если мы продолжим:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit
0 голосов
/ 01 августа 2011

Очевидно, что все целочисленные литералы, начинающиеся с нуля, на самом деле являются восьмеричными.Это означает, что он также включает 0.Это не имеет большого значения, поскольку ноль равен нулю.Но незнание этого факта может навредить вам.

Я понял это, когда пытался написать программу для преобразования двоичных чисел в десятичное и шестнадцатеричное число.Каждый раз, когда я давал число, начинающееся с нуля, я получал неправильный вывод (например, 012 = 10, а не 12).

Хорошо знать эту информацию, чтобы вы не делали ту же ошибку.

...