Numerowanie miesięcy od zera [zamknięte]

98

Niektóre popularne języki programowania używają numeracji miesięcy, która jest przesunięta o 1 - przychodzi na myśl JavaScript, podobnie jak Java, a jeśli pamięć służy, C to drugie. Mam parę pytań:

  • Jeśli zamierzasz zignorować numerację miesięcy używaną przez laików, dlaczego nie dla zachowania spójności zignoruj ​​również numerację dni używaną przez laików i numeruj dni w każdym miesiącu zaczynając od 0?
  • Dlaczego jest to tak powszechne?
  • Czyj to był pomysł?
Robert L
źródło
Tablice zaczynają się od 0, a ludzie odnoszą się do dni liczbami?
glasnt
13
@TomatoSandwich: dość często ludzie odnoszą się do miesięcy numerami i numerują je zaczynając od 1 .
Robert L
2
Nawiasem mówiąc, programiści API nie są bogami; czasami we wdrożeniach pojawiają się błędy; licz sie z tym. Nie żeby tak było (nawet nie mówisz w jakim języku), ale nie oczekuj, że wszystko będzie idealne. Podziwiam jednak chęć poznania przyczyny.
Noon Silk
5
W Japonii używają tylko cyfr. Nie używają stycznia, lutego itp. Świat zachodni również bardzo często używa liczb. Mam nadzieję, że nigdy więcej nie stworzą innego języka programowania, który wybierze styl tablicowy zamiast stylu języka mówionego. To taka prosta poprawka na coś, co będzie używane miliony razy.
Wolfpack'08,
1
Zgoda, choć nie była to uraza wisząca, ktokolwiek to zrobił, zmarnował tylko dziesięć minut mojego czasu i zasługuje na policzek średniej wielkości mokrą rybą.
James McCormack

Odpowiedzi:

53

Użycie zera do rozpoczęcia liczenia jest w rzeczywistości sztuczką optymalizacyjną ze strony programistów Asemblera. Zamiast przypisywać 1 do rejestru zliczającego, dokonali XOR samego rejestru, co było nieco szybsze w cyklach procesora. Oznaczało to, że liczenie rozpoczynałoby się od 0 i zawsze dochodziłoby do długości elementów, z wyłączeniem ostatniego.

Ponadto użycie zera jest również popularne w arytmetyce wskaźników, w których można użyć jednego wskaźnika podstawowego wskazującego na jakąś przydzieloną pamięć, plus drugiego wskaźnika, który byłby przesunięty w stosunku do tego wskaźnika podstawowego. W tym przypadku użycie wartości zero ma sens, aby wskazać przesunięcie na podstawę bloku pamięci. (Ogólna logika tablicowa to zwykle adres bazowy plus przesunięcie x rozmiar rekordu).

A liczby miesięcy od zera? Często wiele środowisk programistycznych oblicza dane jako liczbę dni od niektórych domyślnych danych. 31 grudnia 1899 to popularna data, chociaż było wiele innych dat używanych jako data bazowa. Wszystkie inne daty są odsunięte od tej podstawy i będą przechowywane jako jedna liczba. Ułamki będą używane do wskazania godzin, minut i sekund, gdzie 0,25 oznaczałoby 24/4 = 6 godzin. Tak więc, aby przekształcić datę w prawdziwą datę, wszystko, co musi zrobić środowisko, to przekształcić tę liczbę w prawdziwą datę.

Jednak połączenie tablic od zera i wartości od 1 miesiąca powoduje problem. Aby uzyskać nazwę miesiąca 9, musisz pobrać element 8 z tablicy miesięcy. Niektórzy programiści byliby zadowoleni ze zmniejszenia numeru miesiąca przed uzyskaniem jego nazwy. Inni woleli zmienić miesiąc na coś od zera, ponieważ ludzie chcą znać tylko nazwę, a nie numer. To osobisty pogląd.

Wim ten Brink
źródło
92
Konstruktory JavaScript i AS3 Date przyjmują rzeczywiste wartości dla wszystkiego „z wyjątkiem” miesiąca, który z nieznanego powodu musi być określony jako liczony od zera. To bez wątpienia straszny projekt API.
Triynko
3
Zgadzam się. Kosztowało mnie to tylko godzinę, próbując dowiedzieć się, dlaczego moja randka minęła miesiąc. To naprawdę nie ma sensu, aby wszystko opierało się na 1 z wyjątkiem miesiąca. Niestety, prawdopodobnie nie da się go naprawić, w przeciwnym razie mielibyśmy kolejny problem z roku 2000 :-).
mike gold
1
Tl; dr: z powodu odnośnika matrycy monthName[monthNumber]lub mon_name[tm_mon]w notacji time.h .
Perseids
Ta rzecz z samym sobą XOR to trochę czerwony śledź; to sprawa Intela. Inne MPU miały inne sposoby zerowania rejestrów; niektórzy mieli również skuteczne sposoby ustawiania ich na 1. Głównym powodem rzeczy od zera są obliczenia indeksów; czasami są również przydatne w arytmetyce.
alastair
6

Jest tym, czym jest, a ogromna waga oprogramowania zbudowanego zgodnie z tym założeniem oznacza, że ​​będzie istnieć przez jakiś czas.

Moja opinia jest taka, że to była wina C, a wszystkie te inne Johnie-come-ostatnio w językach tylko upodabnia się z nim.

Otrzymujesz zabawne sytuacje od ludzi, którzy nie wiedzą lepiej. Jednym z nielicznych błędów roku 2000 znalezionych przez nasz zespół była strona internetowa, na której dumnie ogłaszano, że rok 19100 jest po prostu dlatego, że poprzedzał struct tmrok literą „19”.

paxdiablo
źródło
Przynajmniej jedna osoba (nie ja) zdefiniowała funkcje „getRealMonth” i „setRealMonth” do wykorzystania w swoich skryptach. Ani trochę go nie winię.
Robert L
1
Głosuj za informacją o błędzie w roku 2000.
Justus Romijn
4

Tak, Rzymianie też mieli problemy z zerem.

Jest to po prostu [nieintuicyjna] konsekwencja matematyki (będącej silnym składnikiem programowania, zwłaszcza wczesnego programowania) definiowania zera jako pierwszego (problematycznego terminu) rzeczywistej, dodatniej * liczby naturalnej, a ponieważ tablica jest indeksowana liczbą rzeczywistą , liczby naturalne, "pierwszy" element ma indeks 0.

Miesiące są w rzeczywistości nazwanymi wartościami w tablicy, w której dni i lata są wartościami numerowanymi - być może bardziej przydatne byłoby myślenie o dniach / latach jako o tablicach, które wyglądają jak {"1", "2", "3",. .. } sami.

A jeśli chodzi o to, dlaczego jest to tak powszechne (poza matematyczną poprawnością), wszystkie wymienione języki pochodzą z jednego wspólnego źródła ...

Edytować:

Patrząc dalej, ten link do Wikipedii szczegółowo opisuje kilka dobrych i interesujących powodów indeksowania zerowego (co nie mówi bezpośrednio o tym, dlaczego miesiące są indeksowane przez zero, ale myślę, że to już zostało omówione), a ten link SO odpowiedział na pytanie wcześniej.

Wygląda na to, że dominującą opinią jest albo „wypadek historyczny”, albo „ponieważ miesiące nie są liczbami, więc nie można ich porównywać z przechowywaniem w ciągu dnia / roku”, w zależności od tego, kogo zapytasz.

* Przepraszam, przepraszam, fizyka! = Matematyka wraca, żeby mnie tam ugryźć. Idę teraz wyprasować ręce.

annakata
źródło
5
Zero nie jest liczbą dodatnią. Nie jest to również liczba ujemna.
Robert L
Słuszna uwaga, może powinieneś zmienić to na „liczbę naturalną”.
paxdiablo
1
Interesujące, zawsze myślałem, że tablice C zaczynają się od 0, aby uprościć arytmetykę wskaźnika: a[0]== *(a + 0).
za dużo php
2
W rzeczywistości w komputerach możesz mieć dodatnie i ujemne zero, jeśli użyjesz systemu dopełniania Jedni. Na szczęście ten system prawie nigdy nie jest ponownie używany. Zobacz en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink
Miesiąc też jest liczbą, podobnie jak dzień w naszej kulturze. Pierwszy miesiąc w roku to tak naprawdę „1 (pierwszy) miesiąc”, a ostatni „12 (ten) miesiąc”
Michael Tsang,