174 votes

Pourquoi le départ d’indexation avec zéro dans ' C ' ?

Pourquoi l’indexation dans un tableau de démarrage avec zéro en C et non avec 1 ?

127voto

Massimiliano Peluso Points 13357

En C, le nom d'un tableau est essentiellement un pointeur, une référence à un emplacement de la mémoire, et donc l'expression de la matrice de[n] fait référence à un emplacement de la mémoire n-éléments à l'écart de l'élément de départ. Cela signifie que l'indice est utilisé comme un décalage. Le premier élément de la matrice est exactement contenues dans l'emplacement de mémoire que le tableau se réfère (0 éléments de loin), de sorte qu'il devrait être notée en tant que tableau[0].

pour plus d'info:

http://developeronline.blogspot.com/2008/04/why-array-index-should-start-from-0.html

107voto

Anirudh Ramanathan Points 25113

Cette question a été publié plus d'un an, mais voilà...


Sur les raisons ci-dessus

Alors que Dijkstra, l'article a un sens d'un point de vue mathématique, il n'est pas pertinent quand il s'agit de la programmation.

La décision prise par la spécification du langage et du compilateur-designers basée sur la décision prise par le système informatique, les concepteurs de commencer à compter à 0.


La raison probable

Citant un Plaidoyer pour la Paix par Danny Cohen.

Pour toute base b, le premier b^N entiers non négatifs sont représentés par exactement N chiffres (y compris les zéros non significatifs) que si la numérotation commence à 0.

Cela peut être testé assez facilement. En base 2, prendre en 2^3 = 8 Le 8e numéro est:

  • 8 (binaire: 1000) si l'on commence à compter à 1
  • 7 (binaire: 111) si l'on commence à compter à partir de 0

111 peuvent être représentées à l'aide d' 3 bits, alors que 1000 exigera un supplément de bits (4 bits).


Pourquoi est-ce pertinent

Adresses de mémoire d'ordinateur ont 2^N des cellules traitées par N bits. Maintenant, si on commence à compter à 1, 2^N de cellules besoin d' N+1 lignes d'adresse. L'extra-bit est nécessaire pour accéder à exactement 1 adresse. (1000 dans le cas ci-dessus.). Une autre solution serait de laisser la dernière adresse inaccessible, et d'utiliser N lignes d'adresse.

Les deux sont sous-optimal solutions, par rapport à nombre de départ à 0, ce qui permettrait de garder toutes les adresses accessibles, en utilisant exactement N lignes d'adresse!


Conclusion

La décision de commencer à compter à l' 0, a imprégné tous les systèmes numériques, y compris les logiciels en cours d'exécution sur eux, parce qu'il rend plus simple pour le code de traduire ce que le système sous-jacent peut interpréter. S'il n'en était pas ainsi, il y aurait un inutile opération de traduction entre la machine et le programmeur, pour chaque tableau. Il rend la compilation plus facile.


Citant le papier:

enter image description here

83voto

b_erb Points 8869

28voto

Doug T. Points 33360

Parce que 0 est à quelle distance du pointeur à la tête de la matrice de la matrice du premier élément.

Considérer:

int foo[5] = {1,2,3,4,5};

Pour accéder à 0 nous faisons:

foo[0] 

Mais toto se décompose à un pointeur, et le au-dessus de l'accès a l'analogue de l'arithmétique des pointeurs façon d'y accéder

*(foo + 0)

Ces jours-ci de l'arithmétique des pointeurs n'est pas utilisé comme souvent. Chemin du retour quand bien même, c'était un moyen pratique de prendre une adresse et se déplacer X "services de renseignements" à l'écart de ce point de départ. Bien sûr, si vous voulait juste rester là où vous êtes, vous venez d'ajouter de 0!

24voto

Branko Dimitrijevic Points 28493

Parce que l’index de base 0 permet...

.. .pour être implémenté en tant que...

Si les index est de base 1, compilateur aurait besoin de générer : `` , et cette « -1 » nuirait à la performance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X