É como eu disse, ambas as abordagens tem prós e contras. O fato é que a maioria adotou o início em zero, e qualquer coisa diferente disso causa estranhamento.
Na verdade, qualquer coisa diferente do que a gente aprendeu primeiro é "estranho" à primeira vista (imagino que se alguém começa na programação aprendendo Lua e depois vai para outras linguagens, vai achar esquisito começar em zero).
Enfim, além da justificativa matemática, talvez tenha também alguma influência do C nessa história (já que várias linguagens mainstream chupinham muita coisa do C). Mas aí é chute meu, não fiz uma pesquisa sobre.
Em C, v[n]
(seja v
um ponteiro ou um array) é o mesmo que *(v + n)
, ou seja, pega n
elementos à frente do início de v
. Portanto v[0]
é o mesmo que o elemento que está no endereço onde v
aponta, e portanto o "primeiro". Então a forma como a linguagem funciona acabou meio que "determinando" que deve iniciar em zero.
Daí pra outras linguagens - que já estavam se baseando na sintaxe do C - adotarem a mesma convenção, deve ter sido uma decisão quase que automática, imagino eu.
Mas acho que o artigo do Dijkstra deve ter tido mais peso. Não sei, fica a deixa para uma pesquisa futura...