c语言解释一下这个语句

来源:百度知道 编辑:UC知道 时间:2024/06/04 03:10:00
void main()
{
char *p,s[6];int n;
p=s;
gets(p);
n=0;
while(*p != NULL)
{
n=n*8+*p-'0';//这句,为什么要加上这个“-'0'”
p++;
}
printf("%d\n",n);
}

这是一个很典型的将数字字符'0'到'9',转换成对应的整数值的方法。由于在ASCII字符编码中,'0'到'9'是顺序编码的(30h~39h,h表示16进制,换成10进制是48d~57d,d表示10进制)。你的程序假设字符串为数字字符串,*p是'0'到'9'中的一个,但是*p始终是字符,不是整数值,要得到其对应的整数值,就用*p-'0'。C编译器将把*p和'0'转化成其对应的整数编码,然后相减,则得到这两个字符在ASCII编码中的差值(也叫偏移量),这就是*p这个字符对应的整数值。我们看一个例子:
假设*p=='6',*p-'0'就变成'6'-'0',转化成起对应的ASCII编码就是54d-48d,就等于6d,就是整数值6。

另外你的程序有个问题:while(*p != NULL)应该改成
while(*p != NUL)或者while(*p != '\0')

NULL是一个空指针,不是空字符。空字符的ASCII编码是0,类型是char,空指针的类型是void *

因为*p是字符'0'-'9',要把它们转成数值
字符'0'要转换成数值0,就是要“-'0'”的啊

数字加上'0'后变成了对应ASCII码的字符,因为你的数组是字符型的,所以要这样

‘0’在ASCII码中的值是48啊,所以在这里是需要减去的。