2009-09-21 17 views
89

Niektóre popularne języki programowania używają numerowania miesięcy, które jest wyłączone przez 1 - JavaScript przychodzi na myśl, podobnie jak Java, a jeśli pamięć obsługuje, C to kolejna. Mam kilka pytań:Numeracja miesięcy w oparciu o zero

  • Jeśli będzie ignorując numeracji miesięcznej używany przez laików, to dlaczego nie w trosce o spójność również ignorować dniową numerowania stosowany przez laików i liczby dni w każdym miesiąc zaczynający się od 0?
  • Dlaczego jest to tak częste?
  • Czyj to był pomysł?
+0

Tablice, zaczynają się od 0, a ludzie odnoszą się do dni według numerów? – glasnt

+10

@ PomidorSandwich: ludzie często powołują się na _months_ według liczb i numerują je począwszy od _1_. –

+2

API Programiści nie są bogami przy okazji; czasem błędy wchodzą w implementacje; 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. –

Odpowiedz

48

Użycie zera do rozpoczęcia liczenia jest tak naprawdę sztuczką optymalizacyjną od programistów Assembly. Zamiast przypisywać 1 do rejestru zliczania, XOR'ed rejestrował się sam, co było nieco szybsze w cyklach procesora. Oznaczało to, że liczenie rozpocznie się od 0 i zawsze będzie aż do długości elementów, z wyjątkiem ostatniego.

Używanie zera jest również popularne w przypadku arytmetyki wskaźnikowej, w której użyto jednego wskaźnika bazowego wskazującego pewną przydzieloną pamięć oraz drugiego wskaźnika, który byłby przesunięty względem tego wskaźnika bazowego. W tym przypadku użycie wartości zerowej ma duże znaczenie, aby skierować przesunięcie do podstawy bloku pamięci. (Ogólna logika macierzy jest zwykle adresem bazowym plus formatem rekordy x).

I liczby miesięcy liczone od zera? Często wiele środowisk programistycznych oblicza dane jako liczbę dni od czasu niektórych domyślnych danych. 31 grudnia 1899 roku jest popularną datą, mimo że wiele dat było datą podstawową. Wszystkie inne daty są przesunięte względem tej podstawy i będą przechowywane tylko jako jeden numer. Frakcje byłyby używane do wskazania godzin, minut i sekund, gdzie 0,25 byłoby 24/4 = 6 godzin. Tak więc, aby przekształcić datę w rzeczywistą datę, całe środowisko musi zrobić to przekształcić tę liczbę w prawdziwą datę.

Jednak połączenie macierzy opartych na zero i wartości w oparciu o 1 powoduje problem. Aby uzyskać nazwę miesiąca w miesiącu 9, musisz pobrać element 8 z tablicy miesięcy. Niektórzy deweloperzy byliby zadowoleni ze zmniejszenia liczby miesięcy przed otrzymaniem jej nazwy. Inni woleli zmieniać miesiąc na zero, ponieważ ludzie chcą tylko znać nazwę, a nie liczbę. To osobisty widok.

+79

Konstruktory JavaScript i AS3 Date przyjmują wartości rzeczywiste dla wszystkiego "z wyjątkiem" miesiąca, który z nieznanego powodu musi być określony jako zero . To bez wątpienia straszny projekt interfejsu API. – Triynko

+3

Zgadzam się. Kosztowało mnie to tylko godzinę, próbując ustalić, dlaczego moja randka trwa miesiąc. Nie ma większego sensu, aby wszystko było oparte na 1, z wyjątkiem miesiąca. Niestety, prawdopodobnie nie jest to możliwe, inaczej skończyłby się kolejny problem Y2K :-). –

+1

Tl; dr: Z powodu wyszukiwania tablicy 'monthName [monthNumber]' lub 'mon_name [tm_mon]' z [time.h notation] (http://www.cplusplus.com/reference/ctime/asctime/). – Perseids

4

To, co to jest, a ogromna waga oprogramowania zbudowanego na tym założeniu oznacza, że ​​będzie przez jakiś czas.

Moja opinia jest to, że była to wina C, a wszystkie inne języki Johnie-come-ostatnio po prostu z nią zgodne.

Masz zabawne sytuacje od ludzi, którzy nie wiedzą lepiej. Jednym z nielicznych błędów Y2K, które znalazł nasz zespół, była strona internetowa z dumą ogłaszającą rok 19100 po prostu dlatego, że poprzedziły rok struct tm dosłownie "19".

+0

Co najmniej jedna osoba (nie ja) zdefiniowała funkcje "getRealMonth" i "setRealMonth" do użycia w swoich skryptach. Nie obwiniam go ani trochę. –

+1

Pobierz nagranie błędu Y2K. –

4

Tak, Rzymianie mieli również problemy z zerowym poziomem.

To tylko A [nieintuicyjne] Konsekwencją matematyki (jest ważnym elementem programowania, zwłaszcza wcześnie programowanie) definiowania zera jako pierwszy (problematycznego terminu, że jeden) prawdziwe, pozytywny * liczba naturalna, a ponieważ tablica jest indeksowana rzeczywistymi, naturalnymi liczbami, "pierwszy" element ma indeks 0.

Miesiące są tak naprawdę nazwanymi wartościami w tablicy, gdzie dni i lata są wartościami numerowanymi - być może lepiej byłoby myśleć dni/lat jak w tablicach, które wyglądają jak {"1", "2", "3", ...} same.

Co do dlaczego jest to tak powszechne (oprócz tego, że matematycznie poprawne) oraz wszystkie języki, wymienione pochodzą od wspólnego pochodzenia jednej rzeczy ...

Edit:

Patrząc dalej w nią, to łącze wikipedia wyszczególnia kilka dobrych i interesujących przyczyn zerowej indeksacji (co nie mówi bezpośrednio o tym, dlaczego miesiące są indeksowane od zera, ale myślę, że to już jest objęte), a ten link SO już odpowiedział na to pytanie.

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

* Przykro mi, przepraszam, fizyka! = Matematyka wraca, żeby mnie ugryźć. Wyłóż teraz moje ręce.

+5

Zero nie jest liczbą dodatnią. Nie jest to również liczba ujemna. –

+0

Dobra sprawa, może powinieneś zmienić ją na "naturalną liczbę". – 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)'. –