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).
Хорошо знать эту информацию, чтобы вы не делали ту же ошибку.