Почему для представления восьмеричных чисел используются ведущие нули?

Мне всегда было интересно, почему для представления восьмеричных чисел используются ведущие нули (0), а не, например, 0o. Использование 0o было бы столь же полезным, но не вызвало бы столько проблем, как ведущие 0es (например, parseInt('08'); в JavaScript). Каковы причины этого выбора дизайна?


person Hauleth    schedule 14.07.2012    source источник


Ответы (3)


Все современные языки импортируют это соглашение из C, который импортировал его из B, который импортировал его из BCPL.

За исключением BCPL, используется #1234 для восьмеричного и #x1234 для шестнадцатеричного. B отошел от этого соглашения, потому что # был унарным оператором в B (преобразование целого числа в число с плавающей запятой), поэтому # 1234 нельзя было использовать, а # как базовый индикатор был заменен на 0.

Разработчики B постарались сделать синтаксис очень компактным. Я думаю, это причина того, что они не использовали двухсимвольный префикс.

person n. 1.8e9-where's-my-share m.    schedule 14.07.2012

«0b» часто используется для двоичного, а не для восьмеричного. Я подозреваю, что ведущий "0" означает "O -ctal".

Если вы знаете, что собираетесь разбирать восьмеричное число, используйте parseInt('08', 10);, чтобы он трактовал число как основание десять.

person rossum    schedule 14.07.2012
comment
Да, знаю. Мне только интересно, зачем он используется, потому что это немного сбивает с толку новичков. С 0b я сделал ошибку, исправил 0o. - person Hauleth; 14.07.2012
comment
Ноль как в восьмеричном? Едва ли. Я предполагаю, что это был просто преобладающий числовой формат дня, как сейчас шестнадцатеричный. - person tripleee; 14.07.2012
comment
@triplee: Вы ведь понимаете, что 0 выглядит как O, верно? Не то чтобы люди не заменяли 13773rs на номера y34rs. - person Brent Rittenhouse; 01.11.2017

Стоит отметить, что в Python 3.0 они решили, что восьмеричные литералы должны иметь префикс '0o', а старый префикс '0' стал SyntaxError по точным причинам, которые вы указали в своем вопросе.

https://www.python.org/dev/peps/pep-3127/#removal-of-old-octal-syntax.

person Adam.Er8    schedule 23.11.2020