Numeração de mês com base zero [fechado]

98

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?
Robert L
fonte
Matrizes, começam em 0 e as pessoas se referem aos dias por números?
glasnt de
13
@TomatoSandwich: muitas vezes as pessoas se referem aos meses por números, e os numeram começando com 1 .
Robert L
2
A propósito, os programadores de API não são deuses; às vezes, erros entram nas implementações; apenas lide com isso. Não que isso seja exatamente um caso (você nem diz em que idioma), mas não espere que tudo seja perfeito. Admiro querer saber o motivo.
Noon Silk
5
No Japão, eles usam apenas números. Eles não usam janeiro, fevereiro, etc. O mundo ocidental também usa números com muita frequência. Espero que eles nunca façam outra linguagem de programação que escolha o estilo de array ao invés do estilo de linguagem falada novamente. É uma solução tão simples para algo que será usado milhões de vezes.
Wolfpack'08 de
1
Concordo, embora não seja uma ofensa de enforcamento, quem fez isso desperdiçou dez minutos do meu tempo e merece um tapa com um peixe molhado de tamanho médio.
James McCormack

Respostas:

53

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.

Wim ten Brink
fonte
92
Os construtores JavaScript e AS3 Date assumem valores reais para tudo "exceto" o mês, que por um motivo desconhecido deve ser especificado como baseado em zero. Esse é, sem dúvida, um péssimo design de API.
Triynko
3
Concordo. Isso só me custou uma hora tentando descobrir por que meu encontro estava faltando um mês. Na verdade, não faz muito sentido que tudo seja baseado em 1, exceto no mês. Infelizmente, provavelmente não pode ser corrigido, caso contrário, acabaríamos com outro problema Y2K :-).
mike gold
1
Tl; dr: Por causa da pesquisa de matriz monthName[monthNumber]ou mon_name[tm_mon]com a notação time.h .
Perseidas
A coisa do XOR consigo mesmo é um pouco falsa; é uma coisa da Intel. Outros MPUs tinham outras maneiras de zerar registros; alguns também tinham maneiras eficientes de defini-los como 1. A principal razão para coisas baseadas em zero são os cálculos de índice; às vezes, eles também são úteis para a aritmética.
alastair,
6

É 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 tmano com o literal "19".

paxdiablo
fonte
Pelo menos uma pessoa (não eu) definiu as funções "getRealMonth" e "setRealMonth" para uso em seus scripts. Eu não o culpo nem um pouco.
Robert L,
1
Vote positivamente para a referência do bug Y2K.
Justus Romijn
4

Sim, os romanos também tinham problemas com zero.

Esta é apenas uma 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 natural positivo * 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.

Annakata
fonte
5
Zero não é um número positivo. Também não é um número negativo.
Robert L
Bom ponto, talvez você deva alterá-lo para "número natural".
paxdiablo
1
Interessante, sempre pensei que as matrizes C começam em 0 para simplificar a aritmética do ponteiro: a[0]== *(a + 0).
muito php
2
Na verdade, na computação, você pode ter um zero positivo e um negativo se usar o sistema de complemento Um. Felizmente, esse sistema quase nunca é usado novamente. Consulte en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink,
O mês também é um número, assim como o dia em nossa cultura. O primeiro mês em um ano é realmente chamado de "1 (º) mês", e o último é chamado de "12 (º) mês"
Michael Tsang