Algumas linguagens de programação populares usam a numeração de meses que está desviada em 1 - JavaScript vem à mente, assim como Java, e se a memória não funciona, C é outra. Eu tenho algumas questões:
- Se você for ignorar a numeração de meses usada por leigos, por que não, por uma questão de consistência, também ignorar a numeração de dias usada por leigos e numerar os dias de cada mês começando de 0?
- Por que isso é tão comum?
- De quem foi essa ideia em primeiro lugar?
date
language-agnostic
language-design
Robert L
fonte
fonte
Respostas:
O uso de zero para iniciar a contagem é, na verdade, um truque de otimização dos programadores do Assembly. Em vez de atribuir 1 ao registro de contagem, eles XOR'ed o registro com ele mesmo, o que era ligeiramente mais rápido em ciclos de CPU. Isso significava que a contagem começaria com 0 e sempre seria até o comprimento dos elementos, excluindo o último.
Além disso, o uso de zero também é popular com aritmética de ponteiro, onde você usaria um ponteiro de base apontando para alguma memória alocada, mais um segundo ponteiro que estaria em um deslocamento deste ponteiro de base. Aqui, usar o valor zero faz muito sentido apontar o deslocamento para a base do bloco de memória. (A lógica geral da matriz tende a ser o endereço base mais o deslocamento x tamanho do registro.)
E números de mês baseados em zero? Freqüentemente, muitos ambientes de programação calculam os dados como um número de dias desde alguns dados padrão. 31 de dezembro de 1899 é uma data popular, embora muitas outras datas tenham sido usadas como data base. Todas as outras datas são deslocadas desta base e serão armazenadas apenas como um único número. As frações seriam usadas para indicar horas, minutos e segundos, onde 0,25 seria 24/4 = 6 horas. Assim, para transformar uma data em uma data real, tudo o que o ambiente precisa fazer é transformar esse número em uma data real.
No entanto, a combinação de matrizes com base em zero e valores de mês com base em 1 traz um problema. Para obter o nome do mês do mês 9, você teria que obter o item 8 da matriz do mês. Alguns desenvolvedores ficariam felizes em diminuir o número do mês antes de obter seu nome. Outros preferiram mudar o mês para algo baseado em zero, já que as pessoas querem apenas saber o nome, não o número. É uma visão pessoal.
fonte
monthName[monthNumber]
oumon_name[tm_mon]
com a notação time.h .É o que é, e o enorme peso do software desenvolvido para essa suposição significa que ainda existirá por um tempo.
Minha opinião é que foi culpa do C, e todas as outras linguagens Johnie-come-ultimamente se conformaram com ele.
Você consegue algumas situações engraçadas de pessoas que não sabem disso. Um dos poucos bugs do ano 2000 que nossa equipe encontrou foi um site que proclamava orgulhosamente que o ano era 19100, simplesmente porque prefixou o
struct tm
ano com o literal "19".fonte
Sim, os romanos também tinham problemas com zero.
Esta é
apenasuma consequência [não intuitiva] da matemática (sendo um forte componente da programação, especialmente da programação inicial) definindo zero como o primeiro (termo problemático aquele) real, número naturalpositivo* e, uma vez que uma matriz é indexada com real , números naturais, o "primeiro" elemento está no índice 0.Meses são realmente valores nomeados em uma matriz, onde dias e anos são valores numerados - talvez seja mais útil pensar em dias / anos como sendo em matrizes que se parecem com {"1", "2", "3",. .. } si mesmos.
Por que isso é tão comum (além de ser matematicamente correto), bem, todas as línguas que você listou descendem de uma origem comum para uma coisa ...
Editar:
Olhando mais além, este link da Wikipédia detalha vários bons e interessantes motivos para a indexação zero (o que não explica diretamente por que os meses são indexados por zero, mas acho que isso já foi abordado), e este link SO respondeu à pergunta antes.
Parece que a opinião predominante é "acidente histórico" ou "porque os meses não são números, portanto não podem ser comparados ao armazenamento por dia / ano", dependendo de para quem você perguntar.
* Desculpe, desculpe, física! = Matemática voltando para me morder lá. Vou passar a ferro minhas mãos agora.
fonte
a[0]
==*(a + 0)
.