Является ли 0 десятичным литералом или восьмеричным литералом?
ноль всегда равен нулю, так что это не имеет значения. Но в недавнем разговоре с моим другом он сказал, что восьмеричные литералы сегодня почти не используются. Потом до меня дошло, что на самом деле почти все целочисленные литералы в коде are восьмеричной, а именно 0
.
и 0
восьмеричный литерал в соответствии с грамматикой C++? Что говорит стандарт?
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).
приятно это знать информация, чтобы вы не сделали ту же ошибку.