Pourquoi doit-on compter en commençant à 0 en programmation ?
Supposons que vous deviez écrire, en programmant, une boucle qui doit itérer 10 fois.
Hébin, il y a au moins ces deux façons de l'écrire :
- for (i = 0; i < 10; i++)
- for (i = 1; i <= 10; i++)
Soit on démarre de 0 et on s'arrête à 9, soit on démarre de 1 et on s'arrête à 10.
On sait que, d'un point de vue humain, la deuxième solution est plus facilement compréhensible.
On sait tous, aussi, que d'un point de vue développement, c'est la première solution qu'il faut utiliser. (Nota : ça dépend aussi du language de programmation, hein).
Oui mais le pourquoi, bordel ? Vous ne vous être jamais demandé pourquoi il fallait compter en commençant à 0 en programmation ?
Voici une réponse à ce pourquoi. Je suis tombé je sais plus comment sur cette petite démonstration du professeur Edsger W. Dijkstra, que je vous traduis.
Supposons que nous devions décrire qu'un nombre X est compris entre 2 (inclu) et 12 (inclu). Il y a quatre conventions pour écrire cela :
- (A) 2 ≤ x < 13
- (B) 1 < x ≤ 12
- (C) 2 ≤ x ≤ 12
- (D) 1 < x < 13
Examinons-les pour voir laquelle serait la meilleure.
Dans la suite d'entiers 2 .. 12, il y a 11 élèments (et non pas 10).
Les conventions (A) et (B) ont un premier avantage : La différence entre les bornes supérieures et inférieur est égale à la longueur de la suite. 13 - 2 = 11 et 12 - 1 = 11.
Autre avantage des conventions (A) et (B) : elle se comportent bien lorsque on souhaite "coller" deux suites de chiffres. Soit les deux suites :
- 2 ≤ x < 5
- 5 ≤ x < 12
On remarque que le chiffre de la borne supérieure de la première est égale à celui de la borne inférieure de la deuxième, ce qui est bien plus confortable pour travailler.
Ces observations étant faites, comment trancher entre les conventions (A) et (B) ?
La solution (B) présente un gros défaut : pour trouver le plus petit élèment de la suite, on doit effectuer un "calcul" : trouver le plus petit entier naturel strictement plus grand que 1. C'est moche.
En conclusion, la convention (A) semble être la meilleure pour décrire une suite de chiffres.
Donc, programmatiquemment parlant, si je dois effectuer une boucle qui doit itérer 11 fois, la bonne synthaxe est :
for (i = 0; i < 11; i++)
Ainsi, je vois tout de suite d'où je pars (0), je vois tout de suite que je vais itérer 11 fois, et si je dois créer une suite adjacente, je la démarrerais de 11.
Rhô, c'est beau.








