Skip to main content
Th1nkDev
LE MYSTÈRE DU ZÉRO
Back to Academy

Article

LE MYSTÈRE DU ZÉRO

August 6, 2026
In a nutshell

Pourquoi tous les langages de programmation comptent à partir de 0  et pas de 1 Le premier élément d'un tableau Python porte l'indice 0. Pas 1. La toute première ligne d'un fichier de log, la toute première page d'une pagination d'API, le tout premier bit d'un octet : dans presque tous les langages de programmation, on commence à compter à 0. Si vous avez déjà enseigné les bases de la programmation à un débutant complet, vous avez sûrement vu son visage se froisser de perplexité au moment où vous lui expliquez que le "premier" élément d'une liste s'appelle en réalité l'élément "zéro". La plupart des développeurs finissent par intégrer cette convention si profondément qu'ils cessent de se poser la question. On l'apprend, on s'y habitue, et on n'y repense plus. Pourtant, ce choix n'a rien d'arbitraire : il vient d'une décision technique précise, prise dans les années 1960, pour des raisons parfaitement logiques à l'époque , et qui continuent d'avoir des conséquences bien après que la raison initiale a cessé d'être pertinente pour la plupart des langages modernes.

On this page

1. Ce que "compter à partir de 0" veut dire concrètement:

Avant d'aller chercher l'origine historique, il faut bien distinguer deux façons de numéroter une séquence d'éléments, que les informaticiens appellent l'indexation à base 0 ("zero-based indexing") et l'indexation à base 1 ("one-based indexing").

Dans un système à base 1 , celui que tout être humain utilise naturellement dans la vie courante , le premier élément d'une liste de courses porte le numéro 1, le deuxième le numéro 2, et ainsi de suite. C'est le système utilisé par des langages comme Lua, MATLAB, ou encore par les formules Excel.

Dans un système à base 0 , celui de Python, C, Java, JavaScript et de la grande majorité des langages modernes ; le premier élément porte l'indice 0, le deuxième l'indice 1. Ce qui signifie, en apparence de façon contre-intuitive, qu'une liste de 5 éléments va de l'indice 0 à l'indice 4, et non de 1 à 5.

Ce n'est pas une bizarrerie isolée de tel ou tel langage : c'est un choix de conception qui traverse presque toute l'histoire de l'informatique moderne.

2. L'origine : ce que représente vraiment un indice:

Pour comprendre pourquoi ce choix a été fait, il faut remonter à ce qui se passe réellement en mémoire, au niveau le plus bas d'un ordinateur. Quand un programme stocke une liste de valeurs, celles-ci sont rangées les unes derrière les autres dans la mémoire de l'ordinateur, à partir d'une adresse mémoire de départ.

Dans les langages proches du fonctionnement de la machine, comme le C (créé en 1972 par Dennis Ritchie), un indice n'est pas vraiment un numéro d'ordre au sens humain du terme : c'est un décalage (un "offset") par rapport à l'adresse de départ du tableau. Le premier élément se trouve exactement à l'adresse de départ, donc à un décalage de 0 par rapport à elle-même. Le deuxième élément se trouve un cran plus loin, donc à un décalage de 1. Accéder à l'élément d'indice i revient, pour la machine, à faire un simple calcul : adresse_de_depart + i.

Avec cette logique, commencer à compter à 0 n'est pas un choix arbitraire de confort : c'est le reflet exact et le plus direct possible de ce qui se passe en mémoire. Si l'on avait choisi de commencer à 1, chaque accès à un élément aurait nécessité une soustraction supplémentaire (adresse_de_depart + i - 1) à chaque fois, ce qui, sur des machines des années 1970 où chaque cycle de calcul comptait, représentait un coût réel.

3. Edsger Dijkstra et la défense du zéro

Ce choix technique a trouvé son défenseur le plus célèbre en la personne d'Edsger Dijkstra, une figure majeure de l'informatique théorique, connu notamment pour l'algorithme de plus court chemin qui porte son nom. En 1982, alors que le débat entre indexation à base 0 et à base 1 agitait déjà la communauté des chercheurs, il rédige une courte note devenue depuis un classique, intitulée "Why numbering should start at zero".

Son argument dépasse la seule question de performance machine : il porte sur la façon la plus élégante de désigner un intervalle de nombres. Pour représenter une séquence de 5 éléments consécutifs, Dijkstra montre que la notation la plus cohérente mathématiquement est 0 ≤ i < 5 (c'est-à-dire les indices 0, 1, 2, 3, 4), plutôt que 1 ≤ i ≤ 5. La première notation reste cohérente et simple à combiner lorsqu'on enchaîne plusieurs intervalles consécutifs, alors que la seconde oblige à des ajustements de +1 ou -1 à chaque manipulation, une source fréquente d'erreurs de logique.

Pour Dijkstra, l'indexation à partir de 0 n'était pas qu'une question de performance : c'était la convention mathématiquement la plus propre pour manipuler des intervalles.

4. Un choix qui a traversé les générations de langages:

Le langage C, en adoptant cette convention pour des raisons de performance directe, a influencé toute une lignée de langages qui allaient suivre. C++, Java, JavaScript, C#, et bien sûr Python en 1991, ont tous hérité de cette convention, en partie par choix de cohérence avec l'existant, en partie parce que plusieurs générations de développeurs, formés sur ces langages, ont fini par considérer l'indexation à base 0 comme "normale", au point de la reproduire naturellement dans la conception de nouveaux langages.

Il est intéressant de noter que ce choix n'a rien d'universel ni d'obligatoire : certains langages, en particulier ceux orientés vers les utilisateurs non-informaticiens ou vers des domaines spécifiques comme le calcul scientifique, ont fait le choix inverse. C'est le cas de MATLAB, très utilisé en ingénierie, ou de Lua, un langage de script utilisé notamment dans le développement de jeux vidéo, qui commencent tous deux à l'indice 1 , un choix pensé pour rester plus proche de l'intuition mathématique et humaine habituelle.

5. Ce que ce choix continue de coûter aux débutants et aux experts:

Même des décennies plus tard, cette convention reste l'une des sources d'erreurs les plus fréquentes chez les personnes qui apprennent à coder, au point d'avoir un nom dans le jargon des développeurs : les "off-by-one errors", ou erreurs de décalage d'un cran. Une boucle for qui parcourt une liste de 10 éléments mais s'arrête un cran trop tôt ou un cran trop tard, une pagination qui affiche un élément en trop ou en moins : ces erreurs, en apparence anodines, sont l'une des causes de bugs les plus documentées et les plus universelles, tous langages et tous niveaux d'expérience confondus.

Cette convention illustre bien un principe plus large que l'on retrouve dans toute l'histoire de la programmation : un choix technique fait à une époque, pour des raisons précises liées aux contraintes matérielles du moment, peut continuer à structurer la façon de penser de millions de développeurs des décennies plus tard, longtemps après que la contrainte d'origine a disparu. La plupart des ordinateurs actuels n'ont plus vraiment besoin, en pratique, de cette optimisation de calcul d'adresse mémoire qui justifiait le choix initial du C , mais la convention, elle, est restée, portée par l'inertie de tout un écosystème de langages construits les uns sur les autres.

Un exemple très parlant de cette confusion se trouve dans les fonctions de découpage de chaînes ou de listes, comme slice() en Python. Quand on écrit ma_liste[2:5], on obtient les éléments d'indices 2, 3 et 4  trois éléments, et non quatre comme on pourrait naïvement le penser en soustrayant simplement 5 moins 2 plus 1. C'est justement parce que la borne de fin est exclue, une conséquence directe de la logique défendue par Dijkstra : l'intervalle 2 ≤ i < 5 est plus simple à raisonner et à combiner que son équivalent en indexation à base 1.

6. Un débat toujours vivant:

Loin d'être une querelle purement académique refermée depuis longtemps, la question de l'indexation continue de diviser la communauté des concepteurs de langages. Lorsque le langage Julia, pensé pour le calcul scientifique, a été créé en 2012, ses concepteurs ont fait le choix de l'indexation à base 1, précisément parce que leur public cible , chercheurs, ingénieurs, statisticiens raisonne naturellement avec des formules mathématiques où l'on commence à compter à 1, et non avec des adresses mémoire.

Ce choix a d'ailleurs suscité des débats animés au sein même de la communauté Julia, certains développeurs venus du monde du C ou de Python trouvant la convention déroutante, tandis que les utilisateurs venus des mathématiques ou de MATLAB la trouvaient au contraire immédiatement plus naturelle. Cet exemple récent montre bien que le choix entre base 0 et base 1 n'est pas une vérité absolue de l'informatique, mais un compromis de conception, à arbitrer selon le public visé par le langage : des programmeurs système proches de la machine, ou des utilisateurs venus d'un domaine où l'intuition mathématique classique prime.

Certains langages ont même tenté des positions intermédiaires : Lua, par exemple, utilise par convention l'indexation à base 1 pour ses tableaux natifs, mais reste un langage suffisamment flexible pour que des bibliothèques ou des développeurs choisissent d'implémenter leurs propres structures en base 0 lorsque cela leur semble plus pertinent signe que la convention, une fois choisie par un langage, n'est presque jamais une contrainte technique absolue, mais bien un standard culturel que la communauté a choisi de respecter pour rester cohérente.

7. Ce qu'il faut retenir:

Compter à partir de 0 n'est donc ni un caprice de langage, ni une convention purement arbitraire : c'est la trace directe, encore visible aujourd'hui dans du code Python écrit en 2026, d'une décision d'ingénierie prise dans les années 1970 pour économiser un calcul sur des machines aux ressources limitées, puis défendue et théorisée par l'un des plus grands esprits de l'informatique. La prochaine fois qu'un débutant vous demandera, un peu perdu, pourquoi le "premier" élément d'une liste Python s'appelle en réalité l'élément numéro 0, vous saurez que la réponse ne tient pas en une phrase de convention, mais en un demi-siècle d'histoire de l'informatique.

Repères clés:

  • Indexation à base 0 : le premier élément porte l'indice 0 (C, Python, Java, JavaScript...)

  • Indexation à base 1 : le premier élément porte l'indice 1 (MATLAB, Lua...)

  • 1972 : Le langage C généralise l'indexation à base 0, pour des raisons de calcul direct d'adresse mémoire

  • 1982 :Edsger Dijkstra publie "Why numbering should start at zero", justifiant ce choix sur le plan mathématique

  • "Off-by-one error" : la famille de bugs la plus directement liée à cette convention, encore très fréquente aujourd'hui

Found this useful?

Let us know what you think.

Ready to get started?

Your next digital product
Start here.

Let's talk about your project. No commitment required — just an honest conversation about what's possible.