Является ли 0 десятичным литералом или восьмеричным литералом?


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

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

3 315

3 ответа:

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

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

2.14.2 целочисленные литералы [lex.значок]

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

любое целочисленное значение с префиксом 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. Это не имеет большого значения, так как ноль равен нулю. Но незнание этого факта может причинить вам боль.

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

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