Нумерация месяцев с нуля [закрыта]

Некоторые популярные языки программирования используют нумерацию месяцев, которая смещена на 1 — на ум приходит JavaScript, как и Java, и, если мне не изменяет память, C — еще один. У меня есть несколько вопросов:

  • Если вы собираетесь игнорировать нумерацию месяцев, используемую неспециалистами, то почему бы ради последовательности также не игнорировать нумерацию дней, используемую непрофессионалами, и нумеровать дни в каждом месяце, начиная с 0 ?
  • Почему это так распространено?
  • Чья это была идея изначально?

person Robert L    schedule 21.09.2009    source источник
comment
Массивы начинаются с 0, а люди называют дни числами?   -  person glasnt    schedule 21.09.2009
comment
@TomatoSandwich: довольно часто люди называют месяцы числами, и они нумеруют их, начиная с 1.   -  person Robert L    schedule 21.09.2009
comment
Между прочим, программисты API не боги; иногда в реализации попадают ошибки; просто смирись с этим. Не то, чтобы это был именно тот случай (даже не говорите, на каком языке), но не ждите, что все будет идеально. Хотя я восхищаюсь желанием узнать причину.   -  person Noon Silk    schedule 21.09.2009
comment
Ну вот, 280Z28, он лучше?   -  person paxdiablo    schedule 21.09.2009
comment
В Японии используют только числа. Они не используют январь, февраль и т. д. Западный мир также очень часто использует числа. Я надеюсь, что они никогда больше не создадут другой язык программирования, который предпочитает стиль массива стилю разговорного языка. Это такое простое решение для чего-то, что будет использоваться миллионы раз.   -  person Wolfpack'08    schedule 20.10.2011
comment
Согласен, хоть это и не повешение, тот, кто это сделал, просто потратил впустую десять минут моего времени и заслуживает пощечины мокрой рыбой среднего размера.   -  person James McCormack    schedule 13.11.2014
comment
Как преимущество, расчеты по месяцам немного проще с нулевыми месяцами: stackoverflow.com/a/18002968/371137 .   -  person Perseids    schedule 30.08.2015
comment
java.time.Month Имеет вменяемый подсчет, 1-12 за январь-декабрь.   -  person Basil Bourque    schedule 01.09.2019


Ответы (3)


Использование нуля для начала счета на самом деле является оптимизационным трюком программистов на ассемблере. Вместо того, чтобы присваивать 1 регистру счетчика, они произвели операцию XOR с самим регистром, что было немного быстрее в циклах ЦП. Это означало, что подсчет начинался с 0 и всегда доходил до длины элементов, исключая последний.

Кроме того, использование нуля также популярно в арифметике указателей, где вы должны использовать один базовый указатель, указывающий на некоторую выделенную память, плюс второй указатель, который будет смещен от этого базового указателя. Здесь использование нулевого значения имеет большой смысл, чтобы указать смещение на основание блока памяти. (Общая логика массива, как правило, представляет собой базовый адрес плюс смещение x размер записи.)

И номера месяцев с нулевым отсчетом? Часто многие среды программирования рассчитывают данные как количество дней после некоторых данных по умолчанию. 31 декабря 1899 года — популярная дата, хотя в качестве базовой даты использовалось множество других дат. Все остальные даты смещены от этой базы и будут храниться как одно число. Дроби будут использоваться для обозначения часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в реальную дату, все, что нужно сделать среде, — это преобразовать это число в реальную дату.

Однако комбинация массивов с отсчетом от нуля и значений месяца с отсчетом от 1 создает проблему. Чтобы получить название месяца 9, вам нужно будет получить элемент 8 из массива месяцев. Некоторые разработчики были бы рады уменьшить номер месяца, прежде чем получить его название. Другие предпочли изменить месяц на что-то с отсчетом от нуля, поскольку люди просто хотят знать название, а не число. Это личное мнение.

person Wim ten Brink    schedule 21.09.2009
comment
Конструкторы даты JavaScript и AS3 принимают реальные значения для всего, кроме месяца, который по неизвестной причине должен быть указан как отсчитываемый от нуля. Это, несомненно, ужасный дизайн API. - person Triynko; 05.12.2013
comment
Я согласен. Это стоило мне часа, пытаясь понять, почему мое свидание отложено на месяц. На самом деле нет особого смысла в том, чтобы все было основано на 1, кроме месяца. К сожалению, это, вероятно, неисправимо, иначе мы бы столкнулись с еще одной проблемой Y2K :-). - person mike gold; 31.12.2014
comment
Вкратце: из-за поиска в массиве monthName[monthNumber] или mon_name[tm_mon] с нотации time.h . - person Perseids; 30.08.2015
comment
Исключающее ИЛИ с самим собой — это немного отвлекающий маневр; это вещь Intel. У других MPU были другие способы обнуления регистров; у некоторых были эффективные способы установить их на 1. Основная причина для вещей с отсчетом от нуля — расчеты индексов; иногда они полезны и для арифметики. - person alastair; 02.03.2016

Это то, что есть, и огромное количество программного обеспечения, созданного с учетом этого предположения, означает, что оно будет существовать еще какое-то время.

Мое мнение состоит в том, что это было ошибкой C, и все эти другие языки, появившиеся в последнее время, просто согласовывались с ним.

Вы получаете некоторые забавные ситуации от людей, которые не знают лучше. Одной из немногих ошибок 2000 года, обнаруженных нашей командой, был веб-сайт, гордо провозгласивший год 19100 просто потому, что перед struct tm годом стояло буквальное «19».

person Community    schedule 21.09.2009
comment
По крайней мере один человек (не я) определил функции getRealMonth и setRealMonth для использования в своих скриптах. Я ни капельки его не виню. - person Robert L; 21.09.2009
comment
Проголосуйте за ссылку на ошибку Y2K. - person Justus Romijn; 01.12.2014

Да, у римлян тоже были проблемы с нулём.

Это просто [неинтуитивное] следствие математики (являющейся сильным компонентом программирования, особенно раннего программирования), определяющей ноль как первый (проблемный термин, что один) реальный, положительный* натуральное число, а поскольку массив индексируется реальными натуральными числами, «первый» элемент имеет индекс 0.

Месяцы - это действительно именованные значения в массиве, где дни и годы - пронумерованные значения - возможно, было бы полезнее думать о днях/годах как о массивах, которые выглядят как { "1", "2", "3", . .. } сами себя.

Что касается того, почему это так распространено (кроме того, что это математически правильно), то все перечисленные вами языки происходят от общего происхождения с одной стороны...

Редактировать:

Подробнее об этом можно узнать по ссылке Википедии, в которой подробно описаны несколько хороших и интересные причины для нулевой индексации (что напрямую не говорит о том, почему месяцы индексируются с нулевой индексацией, но я думаю, что это уже рассмотрено), и это SO ответила на вопрос ранее.

Похоже, преобладающее мнение — это либо «историческая случайность», либо «потому что месяцы — это не числа, поэтому их нельзя сравнивать с хранением дней/годов», в зависимости от того, кого вы спросите.

* Извините, извините, физика! = математика возвращается, чтобы укусить меня там. Пойду гладить руки.

person annakata    schedule 21.09.2009
comment
Ноль не является положительным числом. Это также не отрицательное число. - person Robert L; 21.09.2009
comment
Хороший вопрос, возможно, вам следует изменить его на натуральное число. - person paxdiablo; 21.09.2009
comment
Интересно, я всегда думал, что массивы C начинаются с 0, чтобы упростить арифметику указателя: a[0] == *(a + 0). - person too much php; 21.09.2009
comment
На самом деле, в вычислительной технике у вас может быть положительный и отрицательный нуль, если вы используете систему дополнения до единиц. К счастью, эта система почти никогда не используется снова. См. en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement - person Wim ten Brink; 22.09.2009
comment
Месяц также является числом, как и день в нашей культуре. Первый месяц в году действительно называется 1(м) месяцем, а последний называется 12(м) месяцем. - person Michael Tsang; 27.02.2019