请问这个程序什么意思?求高手帮忙详细解释下

#include<stdio.h>#include<ctype.h>voidcompute(char*s){intt,r;charop;for(r=0;isdigit(*... #include<stdio.h>
#include<ctype.h>
void compute(char *s)
{
int t,r;
char op;
for(r=0;isdigit(*s);s++)
r=r*10+*s-'0';
while(*s)
{
op=*s++;
for(t=0;isdigit(*s);s++)
t=t*10+*s-'0';
switch(op)
{
case '+':r=r+t;break;
case '-':r=r-t;break;
case '*':r=r*t;break;
case '/':if(t)r=r/t;else{puts("device error");return;}
}
}
printf("%d\n",r);
}
void main()
{
compute("12+6-19+2");
compute("12/6*19/2");
}
到while 那个地方我就看不懂了,求详细解释,满意加分,谢谢啦
展开
 我来答
yshcpu
2013-03-07 · TA获得超过563个赞
知道小有建树答主
回答量:618
采纳率:0%
帮助的人:462万
展开全部
for(r=0;isdigit(*s);s++)
r=r*10+*s-'0';
这一段是将字符串中的数字字符提取出来,转换成真正的十进制int型数值。即遇到非数字字符就退出for循环。
while(*s)是用来判断字符串是否结束(遇到'\0')。
循环体内op=*s++;相当于把退出for循环时遇到的运算符(即非数字)提取出来在后面加以判断。
for(t=0;isdigit(*s);s++)
t=t*10+*s-'0';同前面的类似,是把运算符后面的数字字符转换成十进制数值。

switch(op)
{
case '+':r=r+t;break;
case '-':r=r-t;break;
case '*':r=r*t;break;
case '/':if(t)r=r/t;else{puts("device error");return;}
}这一段是把刚才存储的运算符字符加以判断,再把r和t对应的提取数值进行相应的运算。再把运算的结果保存在r中。这里是多次while循环,中间的计算结果都存在r中,把r当作运算符左侧每次运算后的结果,每次都更新r,这样最后一次运算结束时,r就是整个算式的最终结果。
printf("%d\n",r);最后打印r
追问
*s第一次指向1,r为1.第二次指向2,r为12.第三次*s指向+,此时isdigit判断为0,跳出for循环。接着判断while(*s)为真,继续下面的语句。op的值为+,然后进入第二个for循环,此时*s指向6,t=6.下一步*s指向-,跳出for循环,进入switch判断。此时op=+,r=18.这样想的话就不对了,请问我的思路哪里错了,请帮忙解答下吧,谢谢了。
追答
思路是有点问题,我看到了,你问的第三行,“*s指向6,t=6,下一步*s指向-,跳出for循环",你的意思是说为什么这里s明明指向-却与op=+矛盾是吧?
你也分析了,因为跳出for循环的时候s是指向-,但是你并没有将*s值在当次循环中就赋值给op啊,而是在switch结束之后,下次while循环开始前才赋值给op的,而switch元算中使用的操作符是op中存储的值(因为这里是op变量swich的判断依据在switch后的括号中)。希望对你有帮助。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式