Некоторые популярные языки программирования используют нумерацию месяцев, которая отличается от единицы - на ум приходит JavaScript, как и Java, и, если память не изменяет, другой вариант - C. У меня есть несколько вопросов:
- Если вы собираетесь игнорировать нумерацию месяцев, используемую непрофессионалами, то почему бы для единообразия также не игнорировать нумерацию дней, используемую непрофессионалами, и нумеровать дни каждого месяца, начиная с 0?
- Почему это так часто?
- Чья это вообще была идея?
date
language-agnostic
language-design
Роберт Л
источник
источник
Ответы:
Использование нуля для начала подсчета на самом деле является уловкой оптимизации со стороны программистов на ассемблере. Вместо того, чтобы присвоить единицу счетному регистру, они объединили регистр с помощью операции XOR с самим собой, что было немного быстрее в циклах ЦП. Это означало, что подсчет будет начинаться с 0 и всегда будет соответствовать длине элементов, за исключением последнего.
Кроме того, использование нуля также популярно в арифметике указателей, где вы должны использовать один базовый указатель, указывающий на некоторую выделенную память, плюс второй указатель, который будет со смещением от этого базового указателя. Здесь использование нулевого значения имеет большой смысл, чтобы указать смещение к основанию блока памяти. (Общая логика массива обычно состоит из базового адреса плюс смещение x размер записи.)
А числа месяца с отсчетом от нуля? Часто во многих средах программирования данные вычисляются как количество дней с момента появления некоторых данных по умолчанию. 31 декабря 1899 года - популярная дата, хотя в качестве базовой даты использовалось множество других дат. Все остальные даты смещены от этой базы и будут сохранены как одно число. Дроби будут использоваться для обозначения часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в реальную дату, все, что нужно сделать среде, - это преобразовать это число в реальную дату.
Однако сочетание массивов с отсчетом от нуля и значений месяца с отсчетом от 1 действительно создает проблему. Чтобы получить название месяца 9, вам нужно будет получить элемент 8 из массива month. Некоторые разработчики были бы счастливы уменьшить номер месяца перед тем, как получить его название. Другие предпочли изменить месяц на что-то с нулевым отсчетом, поскольку люди просто хотят знать название, а не число. Это личное мнение.
источник
monthName[monthNumber]
илиmon_name[tm_mon]
с time.h нотации .Это то, что есть, и огромный вес программного обеспечения, построенного на этом предположении, означает, что оно будет существовать какое-то время.
Я считаю , что это была ошибка C, и все остальные языки, появившиеся в последнее время Johnie, просто соответствовали ему.
Вы получаете забавные ситуации от людей, которые ничего не знают. Одна из немногих ошибок 2000 года, обнаруженных нашей командой, - это веб-сайт, гордо объявляющий, что год был 19100 годом, просто потому, что они ставили перед
struct tm
годом букву «19».источник
Да, у римлян тоже были проблемы с нулями.
Это
просто[неинтуитивно] следствие того, что математика (являющаяся сильным компонентом программирования, особенно раннего программирования) определяет ноль как первое (проблематичный термин, равный единице) действительное,положительное* натуральное число, и поскольку массив индексируется действительным , натуральные числа, первый элемент имеет индекс 0.Месяцы на самом деле являются именованными значениями в массиве, где дни и годы являются пронумерованными значениями - возможно, было бы более полезно думать о днях / годах как о массивах, которые выглядят как {"1", "2", "3",. .. } самих себя.
Что касается того, почему это так распространено (помимо математической корректности), то все перечисленные вами языки имеют общее происхождение с одной стороны ...
Редактировать:
Если посмотреть дальше, это ссылке в Википедии подробно описаны несколько хороших и интересных причин для нулевой индексации (которые напрямую не говорят о том, почему месяцы имеют нулевую индексацию, но я думаю, что это уже описано), и эта ссылка SO уже давала ответ на этот вопрос.
Похоже, что преобладающее мнение - либо «историческая случайность», либо «потому что месяцы - это не числа, поэтому их нельзя сравнивать с дневным / годовым хранением» в зависимости от того, кого вы спросите.
* Извините, извините, физика! = Математика возвращается, чтобы укусить меня там. Пойду гладить руки сейчас.
источник
a[0]
==*(a + 0)
.