A sessão de perguntas e respostas de hoje nos é oferecida por cortesia do SuperUser, uma subdivisão do Stack Exchange, um agrupamento de sites de perguntas e respostas conduzido pela comunidade.
A questão
Leitor de superusuário O DragonLord está curioso sobre o motivo pelo qual a maioria dos sistemas operacionais e linguagens de programação contam a partir de zero. Ele escreve:
Computers traditionally tally numerical values starting from zero. For example, arrays in C-based programming languages start from index zero.
What historical reasons exist for this, and what practical advantages does counting from zero have over counting from one?
Por que de fato? Por mais difundida que seja a prática, certamente existem razões práticas para sua implementação.
A resposta
O colaborador do SuperUser, Matteo, oferece os seguintes insights:
Counting arrays from 0 simplifies the computation of the memory address of each element.
If an array is stored at a given position in memory (it’s called the address) the position of each element can be computed as
element(n) = address + n * size_of_the_element
Se você considerar o primeiro elemento o primeiro, o cálculo se torna
element(n) = address + (n-1) * size_of_the_element
Não é uma diferença enorme, mas adiciona uma subtração desnecessária para cada acesso.
Editado para adicionar:
- O uso do índice da matriz como um deslocamento não é um requisito, mas apenas um hábito. O deslocamento do primeiro elemento pode ser oculto pelo sistema e levado em consideração ao alocar e referenciar o elemento.
- Dijkstra publicou um artigo “Por que a numeração deve começar no zero” (pdf), onde ele explica por que começar com 0 é uma escolha melhor. Começar no zero permite uma melhor representação dos intervalos.
Se você está procurando aprofundar a resposta, o artigo de Dijkstra é uma leitura informativa.
Tem algo a acrescentar à explicação? Soe fora nos comentários. Quer ler mais respostas de outros usuários do Stack Exchange com experiência em tecnologia? Confira o tópico de discussão completo aqui.