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ł?
date
language-agnostic
language-design
Robert L
źródło
źródło
Odpowiedzi:
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.
źródło
monthName[monthNumber]
lubmon_name[tm_mon]
w notacji time.h .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 tm
rok literą „19”.źródło
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.
źródło
a[0]
==*(a + 0)
.