C的问题,高手帮忙解决一下

来源:百度知道 编辑:UC知道 时间:2024/05/29 19:24:26
#include<stdio.h>
main()
{
{int a=28,b;
char s[10],*p;
p=s;
do{b=a%16;
if(b<10) *p=b+48;
else *p=b+55;
p++;a=a/5;}while(a>0);
*p='\0';puts(s);}
}
答案是C51,请问为什么得这个结果,可以说具体一点吗?

#include<stdio.h>
main()
{
int a = 28, b;
char s[10], *p;
p = s;
do{
b = a % 16;//b = 12|b = 5|b = 1
if(b<10)
*p=b+48;//jump over|p[1] = 53, ASCII:'5'|p[2] = 49,ASCII:'1'
else
*p=b+55;//p[0] = 67,67 in ASCII is 'C'|jump over|jump over
p++;
a=a/5;//a = 5|a = 1|a = 0
}while(a>0);//jump out
*p='\0';|p[3]='\0'
puts(s);
}

p=s 让指针p指向数组首地址,所以第一次*p = “表达式”相当于a[0]=p[0]=“表达式”,p++后等于指针后移一个int的字节数,即后移到a[1]位置。*p = “表达式”相当于a[1] = p[1]=“表达式”。以后依次类推。
现在来看你的程序。
do{}while循环,先执行一次,那么b = a % 16;a为28,则b为12。b>10,所以
p[0] = b+55 p[0]为67,字符'c'的ascll码是67,之后p++,则下次*p等于 p[1]即a[1],之后a = a/5;a目前为28,计算后a为5,5>0继续下次循环,b = a %16,a为5,则b计算后等于5,5<10, *p = 5 + 48,即p[1] = 53,字符5的ascll码是53,以后同样原理算出p[2] = 49,为字符'1'的ascll码,此时a = 0,结束循环,继续*p =