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


98

Деякі популярні мови програмування використовують нумерацію місяця, яка відключена на 1 - JavaScript приходить на думку, як і Java, а якщо служить пам'ять, C - інша. У мене є кілька питань:

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

Масиви, починати з 0, і люди посилаються на дні за номерами?
glasnt

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

2
Програмісти API до речі не боги; іноді помилки потрапляють у реалізацію; просто розібратися з цим. Не те, що це саме такий випадок (ви навіть не говорите, на якій мові), але не очікуйте, що все буде ідеально. Я захоплююся тим, що хочу дізнатися причину.
полудень Шовк

5
У Японії вони використовують лише номери. Вони не використовують січень, лютий тощо. Західний світ також дуже часто використовує цифри. Я сподіваюся, що вони ніколи не зроблять іншу мову програмування, яка знову вибере стиль масиву над стилем розмовної мови. Це таке просте виправлення того, що буде використано мільйони разів.
Wolfpack'08

1
Погодився, хоч і не звисав, що хтось це робив, просто витратив десять хвилин мого часу і заслуговує на ляп з мокрою рибою середнього розміру.
Джеймс Маккормак

Відповіді:


53

Використання нуля для початку підрахунку насправді є оптимізаційним трюком від програмістів Асамблеї. Замість того, щоб призначити 1 до регістру підрахунку, вони XOR'ed реєстр з собою, що було трохи швидше за циклами процесора. Це означало, що підрахунок починається з 0 і завжди буде дорівнювати довжині елементів, виключаючи останній.

Крім того, використання нуля також популярне в арифметиці вказівника, де ви б використовували один базовий покажчик, що вказує на деяку виділену пам'ять, плюс другий покажчик, який був би зміщений від цього базового вказівника. Тут використання значення нуля має багато сенсу, щоб вказати зміщення на базу блоку пам'яті. (Загальна логіка масиву, як правило, є базовою адресою плюс розміром запису зсуву x.)

І нульові місячні номери? Часто багато середовищ програмування обчислюють дані як кількість днів з моменту деяких даних за замовчуванням. 31 грудня 1899 року - популярна дата, хоча в якості базової дати було використано багато інших дат. Усі інші дати зміщені з цієї бази і просто зберігатимуться як одне єдине число. Дроби використовуються для позначення годин, хвилин і секунд, де 0,25 буде 24/4 = 6 годин. Таким чином, щоб перетворити дату в реальну дату, все, що потрібно робити, це перетворити це число в реальну дату.

Однак комбінація масивів на основі нуля та значень, що базуються на 1 місяці, справді приносить проблему. Щоб отримати назву місяця 9 місяця, вам доведеться отримати пункт 8 з масиву місяців. Деякі розробники будуть раді зменшенню кількості місяця, перш ніж отримати його ім'я. Інші вважали за краще змінити місяць на щось на нульовому рівні, оскільки люди просто хочуть знати ім’я, а не число. Це особистий погляд.


92
Конструктори дат JavaScript та AS3 приймають реальні значення для всього "крім" місяця, який з невідомих причин повинен бути вказаний як нульовий. Це безперечно жахливий дизайн API.
Трайнко

3
Я згоден. Це просто коштувало мені години, намагаючись зрозуміти, чому моя дата була місячною. Насправді не має великого сенсу все базуватись на 1, крім місяця. На жаль, його, ймовірно, не можна виправити, інакше ми закінчилися з іншою проблемою Y2K :-).
мік золото

1
Тл; ін: Через пошуку масиву monthName[monthNumber]або mon_name[tm_mon]з time.h нотації .
Персеїди

Річ із самим собою - це трохи червона оселедець; це справа Intel. Інші MPU мали інші способи нульових регістрів; деякі мали ефективні способи встановити їх також до 1. Основна причина нульових речей - обчислення індексу; іноді вони корисні і для арифметики.
аластер

6

Це те, що воно є, і величезна вага програмного забезпечення, побудованого на цьому припущенні, означає, що це буде деякий час.

На мою думку , це було виною C, і всі ті інші мови, які приїжджають Джонні останнім часом, просто відповідали цьому.

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


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

1
Оновлення для посилання на помилку Y2K.
Юстус Ромійн

4

Так, у римлян теж були проблеми з нулем.

Це лише [неінтуїтивний] наслідок математики (будучи сильною складовою програмування, особливо раннього програмування), що визначає нуль як перший (проблемний термін, який є одним) реальним, позитивним * натуральним числом, а оскільки масив індексується реальним , натуральні числа "перший" елемент знаходиться в індексі 0.

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

Що стосується того, чому це так часто (окрім математично правильного), а всі перелічені вами мови походять із загального походження для однієї речі ...

Редагувати:

Далі вивчаючи далі, ця вікіпедія посилається на кілька добрих і цікавих причин нульової індексації (яка безпосередньо не говорить про те, чому місяці нульово індексуються, але я думаю, що це вже висвітлено), і це ТАК посилання відповів на питання раніше.

Схоже, що переважаюча думка є або "історичною аварією", або "тому, що місяці не є цифрами, тому їх не можна порівнювати зі зберіганням дня / року", залежно від того, кого ви запитуєте.

* Вибачте, вибачте, фізика! = Математика, що повертається, щоб кусати мене там. Зараз прасувати руки.


5
Нуль не є додатним числом. Це також не від’ємне число.
Роберт Л

Хороший момент, можливо, ви повинні змінити його на "натуральне число".
paxdiablo

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

2
Насправді в обчислювальних технологіях ви можете мати додатний і від’ємний нуль, якщо використовувати систему доповнення Ones. На щастя, ця система майже ніколи не використовується знову. Дивіться en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink

Місяць також є числом, як і день у нашій культурі. Перший місяць у році справді називається "1 (й) місяць", а останній називається "12 (й) місяць"
Майкл Цанг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.