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

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

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

Единственное реальное использование, о котором я знаю, - это разрешения файлов Unix.

Ответ 1

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

В соответствии со стандартом С++:

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

Ответ 2

Любое целочисленное значение с префиксом 0 - это восьмеричное значение. I.e.: 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 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

Ответ 3

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

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

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