Je viens de commencer à lire The C Programming Language et j'ai de la difficulté à comprendre une partie. Voici un extrait de la page 24:Valeur numérique des caractères numériques dans C
#include<stdio.h> /*countdigits,whitespace,others*/ main() { intc,i,nwhite,nother; intndigit[10]; nwhite=nother=0; for(i=0;i<10;++i) ndigit[i]=0; while((c=getchar())!=EOF) if(c>='0'&&c<='9') ++ndigit[c-'0']; //THIS IS THE LINE I AM WONDERING ABOUT else if(c==''||c=='\n'||c=='\t') ++nwhite; else ++nother; printf("digits="); for(i=0;i<10;++i) printf("%d",ndigit[i]); printf(",whitespace=%d,other=%d\n", nwhite,nother); }
La sortie de cette exécution du programme sur lui-même est
digits=9300000001,whitespace=123,other=345
La déclaration
intndigit[10];
déclare ndigit être un tableau de 10 entiers. Un tableau des indices commencent toujours à zéro en C, de sorte que les éléments sont
ndigit[0], ndigit[ 1], ..., ndigit[9]
Ceci se reflète dans la boucle pour initialiser et qui impriment la matrice. Un indice peut être n'importe quelle expression entière, qui inclut des variables entières comme i et des constantes entières. Ce programme particulier repose sur les propriétés de la représentation de caractères des chiffres. Par exemple, le test
if(c>='0'&&c<='9')
détermine si le caractère de c est un chiffre. Le cas échéant, la valeur numérique de ce chiffre est
c-'0'`
Cela ne fonctionne que si « 0 », « 1 », ..., « 9 » ont des valeurs décroissantes consécutives. Heureusement, cela est vrai pour tous les jeux de caractères. Par définition, les caractères ne sont que de petits entiers, donc les variables char et les constantes sont identiques aux entiers dans les expressions arithmétiques. C'est naturel et pratique; par exemple
c-'0'
est une expression de nombre entier ayant une valeur comprise entre 0 et 9 correspondant au caractère « 0 » à « 9 » stocké dans c, et donc un indice valable pour le ndigit de réseau.
La partie que j'ai du mal à comprendre pourquoi la partie -'0'
est nécessaire dans l'expression c-'0'
. Si un caractère est un petit nombre entier comme le dit l'auteur, et que les caractères numériques correspondent à leurs valeurs numériques, alors que fait -'0'
?
Merci, l'auteur dit essentiellement la même chose, mais ce n'était pas en train de sombrer dans Tout est logique maintenant.. – ubiquibacon
Si vous saviez que '0' était 48, vous pouvez simplement utiliser 48. L'utilisation de '0' est au moins en partie pour faciliter la portabilité vers d'autres jeux de caractères (non ASCII) où les chiffres ont des valeurs de caractères différentes. –
La norme C garantit que «0» à «9» sont contigus, quel que soit le codage. –