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?
date
language-agnostic
language-design
Robert L.
quelle
quelle
Antworten:
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.
quelle
monthName[monthNumber]
odermon_name[tm_mon]
mit time.h-Notation .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 tm
Jahr das wörtliche "19" vorangestellt wurde .quelle
Ja, die Römer hatten auch Probleme mit Null.
Dies ist
nureine [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.
quelle
a[0]
==*(a + 0)
.