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


98

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

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

Массивы, начинающиеся с 0, и люди называют дни числами?
glasnt

13
@TomatoSandwich: довольно часто люди обращаются к месяцев по номерам, и их число их , начиная с 1 .
Роберт Л.

2
Между прочим, программисты API не боги; иногда ошибки попадают в реализации; просто разберись с этим. Не то чтобы это был именно тот случай (вы даже не говорите на каком языке), но не ожидайте, что все будет идеально. Я восхищаюсь желанием узнать причину.
Noon Silk,

5
В Японии используются только цифры. Они не используют январь, февраль и т. Д. В западном мире также очень часто используются числа. Я надеюсь, что они никогда больше не создадут другой язык программирования, в котором стиль массива будет предпочтительнее стиля разговорного языка. Это такое простое решение проблемы, которое будет использоваться миллионы раз.
Wolfpack'08,

1
Согласен, хоть и не повешение, но тот, кто это сделал, просто потратил десять минут моего времени и заслуживает пощечины мокрой рыбой среднего размера.
Джеймс МакКормак,

Ответы:


53

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

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

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

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


92
Конструкторы Date в JavaScript и AS3 принимают реальные значения для всего, «кроме» месяца, который по неизвестной причине должен быть отсчитан от нуля. Это, несомненно, ужасный дизайн API.
Трийнко 04

3
Я согласен. Это стоило мне часа, пытаясь понять, почему мое свидание истекло через месяц. На самом деле нет особого смысла в том, чтобы все было основано на 1, кроме месяца. К сожалению, это, вероятно, невозможно исправить, иначе мы столкнемся с другой проблемой 2000 года :-).
Майк

1
Тл; др: Из-за поиска массива monthName[monthNumber]или mon_name[tm_mon]с time.h нотации .
Персеиды

Идея XOR с самим собой - отвлекающий маневр; это дело Intel. У других MPU были другие способы обнуления регистров; у некоторых были эффективные способы установить их на 1. Основная причина использования нуля - это расчет индексов; иногда они полезны и для арифметики.
alastair 02

6

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

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

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


По крайней мере, один человек (не я) определил функции «getRealMonth» и «setRealMonth» для использования в своих сценариях. Я его ни капли не виню.
Роберт Л.

1
Проголосуйте за ссылку на ошибку 2000 года.
Justus Romijn

4

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

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

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

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

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

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

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

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


5
Ноль не является положительным числом. Это тоже не отрицательное число.
Роберт Л.

Хорошее замечание, возможно, вам стоит изменить его на «натуральное число».
paxdiablo

1
Интересно, что я всегда думал, что массивы C начинаются с 0, чтобы упростить арифметику указателей: a[0]== *(a + 0).
слишком много php

2
На самом деле, в вычислениях вы можете иметь положительный и отрицательный ноль, если используете систему дополнения Единиц. К счастью, эта система почти никогда больше не используется. См. En.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Вим тен Бринк,

Месяц - это тоже число, как и день в нашей культуре. Первый месяц в году на самом деле называется «1 (ым) месяцем», а последний - «12 (ым) месяцем»
Майкл Цанг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.