Numerazione del mese in base zero [chiuso]


98

Alcuni linguaggi di programmazione popolari utilizzano la numerazione del mese che è diversa da 1: JavaScript viene in mente, così come Java, e se la memoria serve, C è un altro. Ho alcune domande:

  • Se ignorerai la numerazione dei mesi usata dai laici, perché non per coerenza ignorare anche la numerazione dei giorni usata dai laici e numerare i giorni di ogni mese a partire da 0?
  • Perché è così comune?
  • Di chi era questa idea in primo luogo?

Matrici, iniziano da 0 e le persone si riferiscono ai giorni in base ai numeri?
glasnt

13
@TomatoSandwich: molto spesso le persone si riferiscono ai mesi con numeri e li numerano partendo da 1 .
Robert L

2
I programmatori API non sono degli dei, comunque; a volte gli errori entrano nelle implementazioni; affrontalo e basta. Non che sia esattamente un caso (non dici nemmeno quale lingua), ma non aspettarti che tutto sia perfetto. Ammiro il voler sapere il motivo però.
Noon Silk,

5
In Giappone, usano solo numeri. Non usano gennaio, febbraio, ecc. Anche il mondo occidentale usa i numeri molto spesso. Spero che non creino mai più un altro linguaggio di programmazione che scelga lo stile dell'array rispetto allo stile del linguaggio parlato. È una soluzione così semplice per qualcosa che verrà utilizzato milioni di volte.
Wolfpack'08

1
D'accordo, sebbene non sia un'offesa impiccata, chiunque abbia fatto questo ha solo perso dieci minuti del mio tempo e si merita uno schiaffo con un pesce bagnato di media taglia.
James McCormack

Risposte:


53

L'uso di zero per iniziare il conteggio è in realtà un trucco di ottimizzazione dei programmatori di Assembly. Invece di assegnare 1 al registro di conteggio, hanno XOR'ed il registro con se stesso, che era leggermente più veloce nei cicli della CPU. Ciò significava che il conteggio sarebbe iniziato con 0 e sarebbe stato sempre fino alla lunghezza degli elementi, escluso l'ultimo.

Inoltre, l'uso di zero è anche popolare con l'aritmetica del puntatore in cui si userebbe un puntatore di base che punta a una certa memoria allocata, più un secondo puntatore che sarebbe a un offset da questo puntatore di base. Qui, usare il valore zero ha molto senso puntare l'offset alla base del blocco di memoria. (La logica dell'array generale tende ad essere l'indirizzo di base più l'offset x dimensione del record.)

E i numeri del mese in base zero? Spesso molti ambienti di programmazione calcolano i dati come numero di giorni a partire da alcuni dati predefiniti. Il 31 dicembre 1899 è una data popolare, sebbene siano state utilizzate molte altre date come data di base. Tutte le altre date vengono spostate da questa base e verranno memorizzate come un unico numero. Le frazioni verrebbero utilizzate per indicare ore, minuti e secondi, dove 0,25 sarebbe 24/4 = 6 ore. Pertanto, per trasformare una data in una data reale, tutto ciò che l'ambiente deve fare è trasformare questo numero in una data reale.

Tuttavia, la combinazione di array in base zero e valori di mese in base 1 porta un problema. Per ottenere il nome del mese del mese 9, è necessario ottenere l'elemento 8 dall'array del mese. Alcuni sviluppatori sarebbero felici di diminuire il numero del mese prima di ottenere il suo nome. Altri hanno preferito cambiare il mese in qualcosa a base zero poiché le persone vogliono solo conoscere il nome, non il numero. È una visione personale.


92
I costruttori JavaScript e AS3 Date accettano valori reali per tutto "tranne" il mese, che per un motivo sconosciuto deve essere specificato come a base zero. Questo è senza dubbio un pessimo progetto API.
Triynko

3
Sono d'accordo. Questo mi è costato solo un'ora cercando di capire perché il mio appuntamento era scaduto un mese. Non ha molto senso che tutto sia basato su 1 tranne il mese. Sfortunatamente, probabilmente non è risolvibile, altrimenti ci ritroveremmo con un altro problema Y2K :-).
Mike Gold

1
Tl; dr: A causa della ricerca matrice monthName[monthNumber]o mon_name[tm_mon]con notazione time.h .
Perseidi

La cosa XOR-con-se stessa è un po 'una falsa pista; è una cosa Intel. Altre MPU avevano altri modi per azzerare i registri; alcuni avevano anche modi efficienti per impostarli su 1. La ragione principale per le cose a base zero è il calcolo dell'indice; a volte sono utili anche per l'aritmetica.
alastair

6

È quello che è, e l'enorme peso del software costruito su questo presupposto significa che durerà per un po '.

La mia opinione è che sia stata colpa del C, e tutte quelle altre lingue di Johnie-come-ultimamente si sono conformate ad esso.

Ottieni alcune situazioni divertenti da persone che non sanno meglio. Uno dei pochi bug dell'anno 2000 che il nostro team ha trovato è stato un sito web che proclamava con orgoglio l'anno 19100 semplicemente perché faceva precedere l' struct tmanno con il letterale "19".


Almeno una persona (non io) aveva definito le funzioni "getRealMonth" e "setRealMonth" da utilizzare nei suoi script. Non lo biasimo neanche un po '.
Robert L

1
Voto positivo per il riferimento al bug Y2K.
Justus Romijn

4

Sì, anche i romani avevano problemi con lo zero.

Questa è solo una conseguenza [non intuitiva] della matematica (essendo una forte componente della programmazione, in particolare della programmazione iniziale) che definisce zero come il primo (termine problematico quello) numero naturale reale, positivo * e poiché un array è indicizzato con reale , numeri naturali il "primo" elemento è all'indice 0.

I mesi sono in realtà valori denominati in un array, dove giorni e anni sono valori numerati - forse sarebbe più utile pensare a giorni / anni come se fossero in array che assomigliano a {"1", "2", "3",. .. } loro stessi.

Quanto al motivo per cui questo è così comune (oltre ad essere matematicamente corretto), tutte le lingue che hai elencato discendono da un'origine comune per una cosa ...

Modificare:

Analizzando ulteriormente, questo collegamento di wikipedia descrive in dettaglio diversi buoni e interessanti motivi per l'indicizzazione zero (che non parla direttamente del motivo per cui i mesi sono indicizzati a zero ma penso che sia già coperto), e questo collegamento SO ha già risposto alla domanda.

Sembra che l'opinione prevalente sia "incidente storico" o "perché i mesi non sono numeri, quindi non possono essere confrontati con l'archiviazione giornaliera / annuale" a seconda di chi chiedi.

* Scusa, scusa, fisica! = La matematica sta tornando a mordermi lì. Adesso vado a stirare le mani.


5
Lo zero non è un numero positivo. Inoltre non è un numero negativo.
Robert L

Buon punto, forse dovresti cambiarlo in "numero naturale".
paxdiablo

1
Interessante, avevo sempre pensato che gli array C inizino da 0 per semplificare l'aritmetica del puntatore: a[0]== *(a + 0).
troppo php

2
In realtà, in informatica, puoi avere uno zero positivo e uno negativo se usi il sistema di complemento di Uno. Fortunatamente, quel sistema non viene quasi mai più utilizzato. Vedi en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink

Il mese è anche un numero, proprio come il giorno nella nostra cultura. Il primo mese in un anno si chiama veramente "1 (st) month" e l'ultimo si chiama "12 (th) month"
Michael Tsang,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.