Ноль всегда равен нулю, поэтому это не имеет значения. Но в недавней беседе с другом он сказал, что восьмеричные литералы сегодня почти не используются. † Затем до меня дошло, что на самом деле почти все целочисленные литералы в моем коде являются восьмеричными, а именно 0
.
Является 0
ли восьмеричный литерал в соответствии с грамматикой C ++? Что говорит стандарт?
† Единственное реальное использование, о котором я знаю, - это разрешения для файлов Unix.
Ответы:
Да,
0
это восьмеричный литерал в C ++.Согласно стандарту C ++:
2.14.2 Целочисленные литералы [lex.icon]
источник
octal-literal
и другоеdecimal-literal
возможно для интерпретации байтового шаблона, выберитеoctal-literal
. Формулировка официального стандарта не имеет этой проблемы.ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
.1
все еще восьмеричный и всеERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
Любое целое число с префиксом
0
является восьмеричным значением. То есть: 01 является восьмеричным 1, 010 является восьмеричным 10, который является десятичным 8, и 0 является восьмеричным 0 (который является десятичным, и любой другой, 0).Так что да, «0» является восьмеричным.
Это простой английский перевод фрагмента грамматики в ответе @ Als :-)
Целое с префиксом
0x
будет не с префиксом0
.0x
это явно другой префикс Очевидно, есть люди, которые не могут сделать это различие.В соответствии с тем же стандартом, если мы продолжим:
источник
0x
это не знак. Целочисленный литерал, начинающийся с,0x
является единственным токеном.0x
не соответствует требованиям. (По крайней мере, в C это число предварительной обработки (N1570 6.4.8), если оно не является частью шестнадцатеричной константы, но это не токен.)Очевидно, что все целочисленные литералы, начинающиеся с нуля, на самом деле являются восьмеричными. Это означает, что он также включает 0. Это не имеет большого значения, поскольку ноль равен нулю. Но незнание этого факта может повредить вам.
Я понял это, когда пытался написать программу для преобразования двоичных чисел в десятичное и шестнадцатеричное число. Каждый раз, когда я давал число, начинающееся с нуля, я получал неправильный вывод (например, 012 = 10, а не 12).
Хорошо знать эту информацию, чтобы не повторять одну и ту же ошибку.
источник
09
это не восьмеричное число, потому что это вообще не число; он не соответствует синтаксису для любого целочисленного литерала.09
это не восьмеричное число. Что было сказано было: « По этой логике ,09
это восьмеричное число.» Смысл в том , что, так как09
это не восьмеричное число, то логика должна быть неправильной.