Nullbasierte Monatsnummerierung [geschlossen]


98

Einige gängige Programmiersprachen verwenden eine Monatsnummerierung, die um 1 abweicht - JavaScript fällt mir ebenso ein wie Java, und wenn Speicher zur Verfügung steht, ist C eine andere. Ich habe ein paar Fragen:

  • Wenn Sie den Monat Nummerierung von Laien benutzt werden werden ignoriert, warum dann nicht aus Gründen der Konsistenz ignoriert auch die Tage von Laien verwendet Nummerierung und die Anzahl der Tage in jedem Monat ab 0?
  • Warum ist das so häufig?
  • Wessen Idee war das überhaupt?

Arrays, beginnen bei 0 und Leute beziehen sich auf Tage durch Zahlen?
Glasnt

13
@TomatoSandwich: Menschen beziehen sich häufig auf Monate mit Zahlen und nummerieren sie ab 1 .
Robert L

2
API-Programmierer sind übrigens keine Götter; manchmal kommen Fehler in die Implementierungen; Komm damit klar. Nicht, dass dies genau der Fall wäre (Sie sagen nicht einmal, welche Sprache), aber erwarten Sie nicht, dass alles perfekt ist. Ich bewundere es, den Grund wissen zu wollen.
Mittag Seide

5
In Japan werden nur Zahlen verwendet. Sie verwenden nicht Januar, Februar usw. Die westliche Welt verwendet auch sehr oft Zahlen. Ich hoffe, sie machen nie wieder eine andere Programmiersprache, die den Array-Stil dem gesprochenen Sprachstil vorzieht. Es ist eine so einfache Lösung für etwas, das millionenfach verwendet wird.
Wolfpack'08

1
Einverstanden, obwohl kein hängendes Vergehen, wer auch immer dies tat, verschwendete nur zehn Minuten meiner Zeit und verdient eine Ohrfeige mit einem mittelgroßen nassen Fisch.
James McCormack

Antworten:


53

Die Verwendung von Null zum Starten des Zählens ist tatsächlich ein Optimierungstrick von Assembly-Programmierern. Anstatt dem Zählregister 1 zuzuweisen, haben sie das Register mit sich selbst XOR-verknüpft, was in CPU-Zyklen etwas schneller war. Dies bedeutete, dass die Zählung mit 0 beginnen und immer bis zur Länge der Elemente erfolgen würde, mit Ausnahme des letzten.

Die Verwendung von Null ist auch bei Zeigerarithmetik beliebt, bei der Sie einen Basiszeiger verwenden, der auf einen zugewiesenen Speicher zeigt, sowie einen zweiten Zeiger, der von diesem Basiszeiger versetzt ist. Hier ist die Verwendung des Werts Null sehr sinnvoll, um den Versatz auf die Basis des Speicherblocks zu richten. (Allgemeine Array-Logik ist in der Regel die Basisadresse plus Offset x Datensatzgröße.)

Und nullbasierte Monatszahlen? In vielen Programmierumgebungen werden die Daten häufig als Anzahl Tage seit einigen Standarddaten berechnet. Der 31. Dezember 1899 ist ein beliebtes Datum, obwohl viele andere Daten als Basisdatum verwendet wurden. Alle anderen Daten sind von dieser Basis versetzt und werden nur als eine einzige Zahl gespeichert. Brüche würden verwendet, um Stunden, Minuten und Sekunden anzuzeigen, wobei 0,25 24/4 = 6 Stunden wäre. Um ein Datum in ein reales Datum umzuwandeln, muss die Umgebung diese Zahl lediglich in ein reales Datum umwandeln.

Die Kombination von Null-basierten Arrays und 1-basierten Monatswerten bringt jedoch ein Problem mit sich. Um den Monatsnamen von Monat 9 zu erhalten, müssten Sie Element 8 aus dem Monatsarray abrufen. Einige Entwickler würden gerne die Monatszahl verringern, bevor sie den Namen erhalten. Andere zogen es vor, den Monat in etwas Nullbasiertes zu ändern, da die Leute nur den Namen und nicht die Nummer wissen wollen. Es ist eine persönliche Ansicht.


92
Die JavaScript- und AS3-Datumskonstruktoren verwenden reale Werte für alles "außer" den Monat, der aus einem unbekannten Grund als nullbasiert angegeben werden muss. Das ist zweifellos ein schreckliches API-Design.
Triynko

3
Genau. Das hat mich nur eine Stunde gekostet, um herauszufinden, warum mein Date einen Monat aus war. Es macht nicht wirklich viel Sinn, dass alles außer dem Monat auf 1 basiert. Leider ist es wahrscheinlich nicht reparierbar, sonst hätten wir ein weiteres Y2K-Problem :-).
Mike Gold

1
Tl; dr: Wegen der Array-Suche monthName[monthNumber]oder mon_name[tm_mon]mit time.h-Notation .
Perseiden

Das XOR-mit-sich-Ding ist ein bisschen wie ein roter Hering; Es ist eine Intel-Sache. Andere MPUs hatten andere Möglichkeiten, Register auf Null zu setzen. Einige hatten effiziente Möglichkeiten, sie ebenfalls auf 1 zu setzen. Der Hauptgrund für nullbasierte Dinge sind Indexberechnungen; manchmal sind sie auch für die Arithmetik nützlich.
Alastair

6

Es ist, was es ist, und das enorme Gewicht der Software, die auf dieser Annahme basiert, bedeutet, dass es noch eine Weile dauern wird.

Meiner Meinung nach war es die Schuld von C, und all diese anderen Johnie-Come-Recent-Sprachen stimmten einfach damit überein.

Sie bekommen einige lustige Situationen von Leuten, die es nicht besser wissen. Einer der wenigen Fehler im Jahr 2000, die unser Team gefunden hat, war eine Website, auf der stolz verkündet wurde, dass das Jahr 19100 war, nur weil dem struct tmJahr das wörtliche "19" vorangestellt wurde .


Mindestens eine Person (nicht ich) hatte die Funktionen "getRealMonth" und "setRealMonth" für die Verwendung in ihren Skripten definiert. Ich beschuldige ihn kein bisschen.
Robert L

1
Upvote für die Y2K-Fehlerreferenz.
Justus Romijn

4

Ja, die Römer hatten auch Probleme mit Null.

Dies ist nur eine [nicht intuitive] Konsequenz der Mathematik (die ein starker Bestandteil der Programmierung ist, insbesondere der frühen Programmierung), die Null als die erste (problematische Bezeichnung dieser) reelle, positive * natürliche Zahl definiert, und da ein Array mit reell indiziert ist , natürliche Zahlen Das "erste" Element befindet sich am Index 0.

Monate sind wirklich benannte Werte in einem Array, wobei Tage und Jahre nummerierte Werte sind. Es wäre vielleicht sinnvoller, sich Tage / Jahre als Arrays vorzustellen, die wie {"1", "2", "3" ,. .. } sich.

Warum dies so häufig vorkommt (abgesehen davon, dass es mathematisch korrekt ist)? Alle Sprachen, die Sie aufgelistet haben, stammen zum einen von einem gemeinsamen Ursprung ab ...

Bearbeiten:

Wenn Sie genauer hinschauen , enthält dieser Wikipedia- Link einige gute und interessante Gründe für die Nullindizierung (was nicht direkt darauf hinweist, warum Monate nullindiziert sind, aber ich denke, dass dies bereits behandelt wird), und dieser SO- Link hat die Frage bereits zuvor beantwortet.

Es sieht so aus, als ob die vorherrschende Meinung entweder "historischer Unfall" oder "weil Monate keine Zahlen sind und daher nicht mit der Lagerung von Tag / Jahr verglichen werden können" ist, je nachdem, wen Sie fragen.

* Sorry, sorry, Physik! = Mathe kommt zurück, um mich dort zu beißen. Jetzt meine Hände bügeln.


5
Null ist keine positive Zahl. Es ist auch keine negative Zahl.
Robert L

Guter Punkt, vielleicht sollten Sie es in "natürliche Zahl" ändern.
Paxdiablo

1
Interessanterweise hatte ich immer gedacht, dass C-Arrays bei 0 beginnen, um die Zeigerarithmetik zu vereinfachen: a[0]== *(a + 0).
zu viel PHP

2
Tatsächlich können Sie beim Rechnen eine positive und eine negative Null haben, wenn Sie das Komplementsystem der Einen verwenden. Glücklicherweise wird dieses System fast nie wieder verwendet. Siehe en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink

Der Monat ist ebenso eine Zahl wie der Tag in unserer Kultur. Der erste Monat in einem Jahr heißt eigentlich "1. (Monat) Monat", und der letzte heißt "12. (Monat) Monat"
Michael Tsang
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.