In realtà, penso che la versione C che "inizia con 0" sia molto logica quando si osserva il modo in cui è organizzata la memoria. In C possiamo scrivere la seguente:
int* T = new int[10];
Il primo elemento dell'array è * T. Questo è perfettamente "logico" perché * T è l'indirizzo del primo caso di memoria puntato. Il secondo elemento è il secondo caso così * (T + 1): avanziamo di un "sizeof (int)".
Per rendere il codice più leggibile, C ha implementato un alias: T [i] per * (T + i). Per accedere al primo elemento, è necessario accedere a * T che è T [0]. È perfettamente naturale.
Questa idea è prorogato di iteratori:
std::vector<int> T(10);
int val = *(T.begin()+3);
T [i] è solo un alias per * (T.begin() + i).
in Fortran/R, abbiamo solito inizio con 1 a causa di problemi matematici, ma c'è sicuramente altre buone scelte (cf this link per esempio). Non dimenticare che fortran può facilmente utilizzare array che iniziano con 0:
PROGRAM ZEROARRAY
REAL T(0:9)
T(0) = 3.14
END
"Il solito' 0' "è piuttosto relativo. La mia prima tazza di caffè al mattino è il mio primo, non il mio zero-th. –
Ma quando sei nato hai zero anni e devi aspettare un anno per il tuo primo compleanno. – Frank
Poiché l'età è misurata in * anni completati *. Solo una convenzione diversa. Le mie dita sono ancora numerate da 1 a 10. –