2009-09-21 10 views
89

Alcuni linguaggi di programmazione popolari utilizzano la numerazione del mese disattivata da 1 - Mi viene in mente JavaScript, così come Java, e se la memoria serve, C è un'altra. Ho alcune domande:Numerazione mensile a zero

  • Se avete intenzione di ignorare la numerazione mese usata da laici, allora perché non per motivi di coerenza anche ignorare il numerazione giorno utilizzato dai laici, e il numero dei giorni in ogni mese a partire da 0?
  • Perché è così comune?
  • Di chi è stata l'idea in primo luogo?
+0

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

+10

@TomatoSandwich: molto spesso le persone si riferiscono a _months_ per numero e le numerano a partire da _1_. I programmatori API –

+2

non sono a proposito; a volte gli errori entrano nelle implementazioni; solo affrontarlo. Non che questo sia esattamente un caso (non si dice nemmeno in che lingua), ma non aspettarsi che tutto sia perfetto. Ammiro di voler sapere la ragione però. –

risposta

48

L'utilizzo di zero per iniziare il conteggio è in realtà un trucco di ottimizzazione dei programmatori di assiemi. Invece di assegnare 1 al registro dei conteggi, XOR hanno registrato il registro con se stesso, che era leggermente più veloce nei cicli della CPU. Ciò significava che il conteggio iniziava con 0 e sarebbe sempre pari alla lunghezza degli elementi, escludendo l'ultimo.

Inoltre, l'uso di zero è anche popolare con l'aritmetica del puntatore dove si usa un puntatore di base che punta a una memoria allocata, più un secondo puntatore che si trova 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 di array generale tende ad essere l'indirizzo di base più la dimensione del record di offset x.)

E numeri di mese a base zero? Spesso, molti ambienti di programmazione calcolano i dati come un numero di giorni da quando alcuni dati predefiniti. Il 31 dicembre 1899 è una data popolare, sebbene ci siano state molte altre date usate come date di base. Tutte le altre date sono compensate da questa base e verranno semplicemente memorizzate come un unico numero. Le frazioni verrebbero utilizzate per indicare ore, minuti e secondi, dove 0,25 sarebbero 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 matrici basate su zero e valori di mese basati su 1 comporta un problema. Per ottenere il nome del mese del mese 9, è necessario ottenere l'articolo 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 dal momento che le persone vogliono solo conoscere il nome, non il numero. È una visione personale.

+79

I costruttori JavaScript e AS3 Date prendono valori reali per tutto "tranne" il mese, che per un motivo sconosciuto deve essere specificato come zero . Questo è senza dubbio un terribile design API. – Triynko

+3

Sono d'accordo. Questo mi è costato un'ora per cercare di capire perché il mio appuntamento era di un mese. Non ha molto senso che tutto sia basato su 1 tranne che sul mese. Sfortunatamente, è probabilmente non risolvibile, altrimenti finiremmo con un altro problema Y2K :-). –

+1

Tl; dr: A causa della ricerca della matrice 'monthName [monthNumber]' o 'mon_name [tm_mon]' con [time.h notation] (http://www.cplusplus.com/reference/ctime/asctime/). – Perseids

4

È quello che è, e l'enorme peso del software costruito su tale presupposto significa che sarà in giro per un po '.

Il mio opinione è che è stata colpa di C, e tutte quelle altre lingue di Johnie-come-ultimamente si sono conformate con esso.

È possibile ottenere alcune situazioni divertenti da persone che non conoscono meglio. Uno dei pochi bug Y2K riscontrati dal nostro team è stato un sito Web che proclamava con orgoglio l'anno 19100 semplicemente perché avevano preceduto l'anno struct tm con il letterale "19".

+0

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

+1

Voto superiore per il riferimento al bug Y2K. –

4

Sì, anche i romani hanno avuto problemi con lo zero.

Questo è solo un [non intuitivo] conseguenza della matematica (essendo una forte componente di programmazione, soprattutto nelle prime fasi di programmazione) definente zero come prima (termine problematico quella) reale, positivo * numero naturale, e dal momento che un array è indicizzato con numeri reali, naturali il "primo" elemento è all'indice 0.

I mesi sono valori realmente denominati in un array, dove i giorni e gli anni sono valori numerati - sarebbe forse più utile pensare di giorni/anni come in array che sembrano {"1", "2", "3", ...} loro stessi.

Per quanto riguarda il motivo per cui questo è così comune (oltre ad essere matematicamente corretto) e tutte le lingue che hai elencato discendono da un'origine comune per una cosa ...

Edit:

Guardando ancora più in esso, questo collegamento wikipedia descrive diversi motivi validi e interessanti per l'indicizzazione zero (che non parla direttamente al motivo per cui i mesi sono indicizzati a zero ma penso che sia già coperto) e questo collegamento SO ha risposto alla domanda precedente.

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

* Scusa, scusa, fisica! = La matematica torna a mordermi. Via a stirare le mie mani ora.

+5

Zero non è un numero positivo. Inoltre, non è un numero negativo. –

+0

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

+1

Interessante, avevo sempre pensato che i C array iniziassero a 0 per semplificare l'aritmetica del puntatore: 'a [0]' == '* (a + 0)'. –