我刚刚开始阅读C语言编程,我无法理解一个部分.以下是第24页的摘录:
Run Code Online (Sandbox Code Playgroud)#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); }该程序的输出本身就是
Run Code Online (Sandbox Code Playgroud)digits=9300000001,whitespace=123,other=345声明
Run Code Online (Sandbox Code Playgroud)intndigit[10];将ndigit声明为10个整数的数组.数组下标总是从C开始为零,因此元素是
Run Code Online (Sandbox Code Playgroud)ndigit[0], ndigit[ 1], ..., ndigit[9]这反映在初始化和打印数组的for循环中.下标可以是任何整数表达式,包括整数变量,如i和整数常量.此特定程序依赖于数字的字符表示的属性.例如,测试
Run Code Online (Sandbox Code Playgroud)if(c>='0'&&c<='9')确定c中的字符是否为数字.如果是,则该数字的数值为
Run Code Online (Sandbox Code Playgroud)c-'0'`仅当'0','1',...,'9'具有连续增加的值时,这才有效.幸运的是,对于所有字符集都是如此.根据定义,字符只是小整数,因此char变量和常量与算术表达式中的int相同.这很自然方便; 例如
Run Code Online (Sandbox Code Playgroud)c-'0'是一个整数表达式,其值介于0和9之间,对应于存储在c中的字符"0"到"9",因此是数组ndigit的有效下标.
我无法理解的-'0'部分是为什么表达部分是必要的c-'0'.如果一个字符是作者所说的小整数,并且数字字符对应于它们的数值,那么正在-'0'做什么?
数字字符与其数字值不对应.它们对应于它们的编码值(在本例中为ASCII).
IIRC,ascii'0'是值48.并且,幸运的是,对于该示例和大多数字符集,"0"到"9"的值按字符集顺序存储.
因此,从任何ASCII数字中减去"0"的ASCII值将返回其"0"的"真"值.
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |