Maths, Informatique, Jeux
Site Web réalisé par Frédéric et François WANG
Répertoire principalInformatiqueProgrammationDiversPourquoi zéro ?

Introduction

« 1, 2, 3, ... ». Mis à part quelques mathématiciens ayant étudié les nombres ordinaux et cardinaux, voici comment la plupart des gens commencerait à compter. Cependant dans les langages de programmation modernes, le choix qui est fait est celui de commencer à zéro : le premier élément d'un tableau est celui d'indice 0, le premier caractère d'une chaine est en position 0...

Le néophyte peut être quelque peu déstabilisé par une telle situation et se demander « mais pourquoi commencer à zéro ? ». Le but de cette page est d'éclairer ce choix et de le justifier.

Différents points

Congruence mathématique

Souvent, un objet donné ne prend qu'un nombre fini d'états différents, disons n. Il est alors judicieux de la coder sous forme d'un entier prenant les valeurs de 0 à n - 1. Ceci offre une utilisation de l'ordre usuel sur les entiers ordonnant naturellement les différentes valeurs. Cela est aussi possible avec une numérotation de 1 à n, néanmoins, commencer à zéro permet aussi d'utiliser avantageusement la congruence mathématique.

Rappelons que l'opération donnant le reste (MOD en BASIC et % en C) d'un entier retourne toujours un résultat entre 0 et n - 1 (du moins pour un entier positif), ce qui correspond au premier intervalle. Comme un exemple vaut mieux qu'un long discours, voici deux programmes BASIC illustrant cette utilisation :


' Programme : sélection d'une valeur parmi n choix
' "+" = augmenter, "-" = diminuer, " " = quitter

' Version 1 : numérotation de 1 à n
c = 1: n = 50
DO
LOCATE 1, 1: PRINT c; " "
tt$ = INKEY$
IF tt$ = "+" THEN c = c + 1: IF c = n + 1 THEN c = 1
IF tt$ = "-" THEN c = c + 1: IF c = -1 THEN c = n
LOOP WHILE tt$ <> " "

' Version 2 : numérotation de 0 à n - 1
c = 0: n = 50
DO
LOCATE 1, 1: PRINT c; " "
tt$ = INKEY$
IF tt$ = "+" THEN c = (c + 1) MOD n
IF tt$ = "-" THEN c = (c - 1 + n) MOD n
LOOP WHILE tt$ <> " "

' Version 3 : numérotation de 0 à n - 1
' "a", "q" = déplacement de 3 en 3
c = 0: n = 50
DO
LOCATE 1, 1: PRINT c; " "
tt$ = INKEY$
IF tt$ = "+" THEN c = (c + 1) MOD n
IF tt$ = "-" THEN c = (c - 1 + n) MOD n
IF tt$ = "q" THEN c = (c + 3) MOD n
IF tt$ = "a" THEN c = (c - 3 + n) MOD n
LOOP WHILE tt$ <> " "

La variable c représente est le numéro choisi. On voit que dans la première version on a besoin d'ajouter des conditions supplémentaires pour gérer le débordement de c. Par contre dans la seconde il suffit de modifier c modulo n (notons qu'il faut parfois ajouter n pour éviter d'être dans le cas entier négatif). La troisième version du programme montre que ceci se modifie facilement pour des déplacements de 3 en 3 par exemple, alors que cela serait plus difficile pour une numérotation entre 1 et n.

Organisation de la mémoire

Imaginons cas de données stockées à l'adresse A (disons ici un nombre). Par exemple un tableau d'éléments codé chacun sur n octets. Pour accéder au i-ème élément du tableau la formule pour le calcul de l'adresse est simplement A + i × n pour un codage commençant à zéro. Par exemple, on suppose que l'on dispose d'un tableau de couleur RGB, c'est-à-dire d'une suite de blocs de 3 octets (tableau d'unsigned char) codant chacun la quantité de rouge, vert et bleu d'une couleur. Si on code à partir de 0, la valeur de la i-ème couleur sera donnée par couleur[3 * i] + 256 * couleur[3 * i + 1] + 65536 * couleur[3 * i + 2], où l'on reconnait chacune des composantes rouge, vert et bleu de cette i-ième couleur. Si on avait commencé à partir de 1, on aurait du remplacer chaque i par (i - 1).

Une autre remarque concerne le codage du type entier non signé qui peut permettre de représenter un indice. La convention est de le faire commencer à zéro : s'il est codé sur un octet il prend les valeurs de 0 à 255, sur deux octets de 0 à 65535 etc Là encore, si on souhaite un codage optimal, il convient donc de numéroter à partir de zéro notamment pour un stockage dans un fichier.

Les conventions des langages

Sur ce point, il y a une certaine dépendance vis-à-vis du langage utilisé. Ainsi le C est plus adapté à un codage à partir 0 de alors que pour le BASIC il s'agit plutôt de 1. Il revient aux concepteurs de langage de programmation de choisir un codage judicieux. Citons simplement l'exemple du Caml qui adopte une syntaxe peu commode pour les boucles for. On est en effet obligé de rajouter des « -1 » pour la borne supérieur alors qu'en C, l'utilisation du strictement inférieur est plus avantageux :


/* Affichage en C des n premières valeurs d'un tableau d'entiers. */
for(i = 0; i < n; i++)printf("%d", valeur[i]);

(* Affichage en Caml des n premières valeurs d'un tableau d'entiers. *)
for i = 0 to n - 1 do print_int(valeur.(i)) done;

Communication avec l'utilisateur

Lorsque des personnes utilisent votre programme, par exemple un logiciel, il a souvent besoin de configurer certains paramètres. Or, comme dit dans l'introduction, l'habitude veut que nous commencions à numéroter à partir de 1. Ainsi pour donner le choix entre plusieurs options, on aura tendance à faire :

Si dans le codage des informations on a numéroté à partir de 0 il faudra alors, par exemple pour l'affichage a l'écran, redécaler tout en ajoutant des « +1 », ce qui peut devenir un inconvénient. Néanmoins il n'est pas toujours nécessaire de commencer à 1 : prenons par exemple le cas d'un éditeur d'image. Le codage des coordonnées commencent à (0, 0) pour un coin tandis que pour une image à 2, 16 ou 256 couleurs où l'utilisation d'une palette est en jeu, on numérote les couleurs en commençant à 0. Ceci étant universel, cela n'intrigue pas l'utilisateur. Plus généralement, le codage à partir de zéro peut être utilisé pour la communication avec l'utilisateur lorsque celui-ci y est familier. Un cas typique est celui où l'utilisateur est lui-même un programmeur qui connait les valeurs prises par les variables.

Ainsi, la remarque inverse s'applique aussi puisqu'il faut ajouter des « -1 » si on a commencé à coder à 1. Or vus les avantages cités précédemment en faveur du codage débutant à zéro, l'ajout des « +1 » est finalement moins pénible.

Conclusion

J'espère en avoir dit assez pour montrer que l'utilisation d'une numérotation commençant à zéro comportait plus d'avantages que d'inconvénients et ainsi convaincu de l'intérêt voire de la nécéssité de l'employer. Elle facilite en effet grandement la programmation même si elle n'est pas toujours en concordance avec la familiarité des utilisateurs du programme.

Cette page est conforme aux normes du W3C - Auteur : Frédéric WANG - Dernière mise à jour : samedi 5 aout 2006
Valid XHTML 1.1 Valid MathML 2.0 Valid SVG Valid CSS Amaya, the W3C browser/editor Déclaration qualité Opquast Firefox