Numérotation mensuelle basée sur zéro [fermé]

98

Certains langages de programmation populaires utilisent la numérotation des mois qui est décalée de 1 - JavaScript vient à l'esprit, tout comme Java, et si la mémoire est bonne, C en est un autre. J'ai quelques questions:

  • Si vous allez ignorer la numérotation des mois utilisée par les profanes, alors pourquoi pas, par souci de cohérence, ignorez également le jour numérotation des utilisée par les profanes et numérotez les jours de chaque mois à partir de 0?
  • Pourquoi est-ce si courant?
  • À qui était cette idée en premier lieu?
Robert L
la source
Les tableaux, commencent à 0, et les gens font référence aux jours par des nombres?
glasnt
13
@TomatoSandwich: assez souvent, les gens font référence aux mois par des nombres, et ils les numérotent à partir de 1 .
Robert L
2
Les programmeurs d'API ne sont pas des dieux d'ailleurs; parfois des erreurs entrent dans les implémentations; débrouille toi avec. Non pas que ce soit exactement un cas (vous ne dites même pas quelle langue), mais ne vous attendez pas à ce que tout soit parfait. J'admire cependant vouloir en connaître la raison.
Noon Silk
5
Au Japon, ils n'utilisent que des chiffres. Ils n'utilisent pas janvier, février, etc. Le monde occidental utilise aussi très souvent des nombres. J'espère qu'ils ne feront plus jamais un autre langage de programmation qui choisisse le style de tableau plutôt que le style de langage parlé. C'est une solution si simple pour quelque chose qui sera utilisé des millions de fois.
Wolfpack'08
1
D'accord, bien que ce ne soit pas une offense pendante, celui qui a fait cela vient de perdre dix minutes de mon temps et mérite une gifle avec un poisson mouillé de taille moyenne.
James McCormack

Réponses:

53

L'utilisation de zéro pour commencer à compter est en fait une astuce d'optimisation des programmeurs d'assemblage. Au lieu d'attribuer 1 au registre de comptage, ils ont XOR'ed le registre avec lui-même, ce qui était légèrement plus rapide dans les cycles CPU. Cela signifiait que le comptage commencerait par 0 et serait toujours jusqu'à la longueur des éléments, à l'exclusion du dernier.

En outre, l'utilisation de zéro est également populaire avec l'arithmétique de pointeur où vous utiliseriez un pointeur de base pointant sur une mémoire allouée, plus un deuxième pointeur qui serait à un décalage par rapport à ce pointeur de base. Ici, utiliser la valeur zéro a beaucoup de sens pour pointer le décalage vers la base du bloc de mémoire. (La logique générale du tableau a tendance à être l'adresse de base plus le décalage x la taille de l'enregistrement.)

Et les numéros de mois basés sur zéro? Souvent, de nombreux environnements de programmation calculent les données en nombre de jours depuis certaines données par défaut. Le 31 décembre 1899 est une date populaire, bien qu'il y ait eu beaucoup d'autres dates utilisées comme date de base. Toutes les autres dates sont décalées de cette base et ne seront stockées que sous la forme d'un seul nombre. Les fractions seraient utilisées pour indiquer les heures, les minutes et les secondes, où 0,25 serait 24/4 = 6 heures. Ainsi, pour transformer une date en date réelle, il suffit à l'environnement de transformer ce nombre en date réelle.

Cependant, la combinaison de tableaux de base zéro et de valeurs de mois de base 1 pose un problème. Pour obtenir le nom du mois du mois 9, vous devez obtenir l'élément 8 du tableau des mois. Certains développeurs seraient heureux de réduire le nombre de mois avant d'obtenir son nom. D'autres ont préféré changer le mois en quelque chose de basé sur zéro puisque les gens veulent juste connaître le nom, pas le nombre. C'est un point de vue personnel.

Wim ten Brink
la source
92
Les constructeurs JavaScript et AS3 Date prennent des valeurs réelles pour tout "sauf" le mois, qui, pour une raison inconnue, doit être spécifié comme basé sur zéro. C'est sans aucun doute une conception d'API terrible.
Triynko
3
Je suis d'accord. Cela m'a juste coûté une heure à essayer de comprendre pourquoi mon rendez-vous était dans un mois. Cela n'a pas vraiment beaucoup de sens que tout soit basé sur 1, sauf pour le mois. Malheureusement, il est probablement impossible à résoudre, sinon nous nous retrouverions avec un autre problème de l'an 2000 :-).
mike gold
1
Tl; dr: En raison de la recherche de tableau monthName[monthNumber]ou mon_name[tm_mon]avec la notation time.h .
Perseids
La chose XOR-avec-soi est un peu un hareng rouge; c'est un truc Intel. D'autres MPU avaient d'autres moyens de mettre à zéro les registres; certains avaient également des moyens efficaces de les mettre à 1. La principale raison des choses à base zéro est le calcul des indices; parfois, ils sont également utiles pour l'arithmétique.
alastair
6

C'est ce que c'est, et le poids énorme des logiciels construits sur cette hypothèse signifie qu'il va exister pendant un certain temps.

Mon opinion est que c'était la faute de C, et tous ces autres langages Johnie-come-récemment s'y sont conformés.

Vous obtenez des situations amusantes de personnes qui ne savent pas mieux. L'un des rares bogues de l'an 2000 que notre équipe a trouvés était un site Web proclamant fièrement que l'année était 19100 simplement parce qu'il préfixait l' struct tmannée avec le littéral «19».

paxdiablo
la source
Au moins une personne (pas moi) avait défini les fonctions "getRealMonth" et "setRealMonth" à utiliser dans ses scripts. Je ne lui en veux pas du tout.
Robert L
1
Vote favorable pour la référence de bogue de l'an 2000.
Justus Romijn
4

Oui, les Romains avaient également des problèmes avec zéro.

Ceci est juste une conséquence [non intuitive] des mathématiques (étant une composante forte de la programmation, en particulier la programmation précoce) définissant zéro comme le premier (terme problématique celui-là) réel, positif * nombre naturel, et puisqu'un tableau est indexé avec réel , nombres naturels le "premier" élément est à l'index 0.

Les mois sont en fait des valeurs nommées dans un tableau, où les jours et les années sont des valeurs numérotées - il serait peut-être plus utile de penser aux jours / années comme étant dans des tableaux qui ressemblent à {"1", "2", "3",. ..} eux-mêmes.

Quant à savoir pourquoi c'est si commun (en plus d'être mathématiquement correct), toutes les langues que vous avez énumérées descendent d'une origine commune pour une chose ...

Éditer:

En regardant plus loin, ce lien wikipedia détaille plusieurs bonnes et intéressantes raisons de l'indexation zéro (qui ne explique pas directement pourquoi les mois sont indexés à zéro mais je pense que c'est déjà couvert), et ce lien SO a déjà répondu à la question.

On dirait que l’opinion dominante est soit «un accident historique», soit «parce que les mois ne sont pas des nombres et ne peuvent donc pas être comparés au stockage jour / année» selon à qui vous demandez.

* Désolé, désolé, la physique! = Les maths reviennent pour me mordre. Je vais repasser mes mains maintenant.

Annakata
la source
5
Zéro n'est pas un nombre positif. Ce n'est pas non plus un nombre négatif.
Robert L
Bon point, peut-être devriez-vous le changer en "nombre naturel".
paxdiablo
1
Intéressant, j'avais toujours pensé que les tableaux C commencent à 0 pour simplifier l'arithmétique du pointeur: a[0]== *(a + 0).
trop de php
2
En fait, en informatique, vous pouvez avoir un zéro positif et négatif si vous utilisez le système de complément des uns. Heureusement, ce système n'est presque plus jamais utilisé. Voir en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink
Le mois est aussi un nombre, tout comme le jour dans notre culture. Le premier mois d'une année est vraiment appelé "1 (er) mois", et le dernier est appelé "12 (e) mois" »
Michael Tsang