鱼C论坛

 找回密码
 立即注册
查看: 2068|回复: 3

[已解决]各位大神求救。

[复制链接]
发表于 2017-10-23 08:27:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


        do
        {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        num = 10 * num + (ch - '0');
                }
                else
                {
                        if (num)
                        {
                                break; // 如果已有数字,则退出循环
                        }
                }

        }
        while (ch != '\n');


     里面的           if (ch >= '0' && ch <= '9')
               
                        num = 10 * num + (ch - '0');
    是什么意思,我初学看不懂求教各位大神

最佳答案
2017-10-23 12:47:07
首先,获取一个输入字符,判断是不是字符'0'-'9'(if (ch >= '0' && ch <= '9') ),这里的&&表示如果不满足ch >= '0'那么就不判断了,因为判断ch <= '9'没有意义,然后如果是数字(num的初始化的值应该是0),那么吧原来num的值乘以10,再加上输入的值,这里用 (ch - '0')获取到输入的数值,因为ASSIC码里面的数字字符都是顺序的,所以输入的这个字符只要是数字,那么它减去‘0’得到的就是所需要的值,比如‘8’-‘0’=8(前面两个是字符类型,得到的结果是int类型),终于后面的else,表示如果num的值不等于0,那么就退出循环,好像有点复杂的样子

我们走一下流程吧,这里假设输入123回城
首先进入while循环,获取输入
得到第一次输入的是1,这时候num=0,
判断输入的是字符1,条件满足,于是num*10+1 =1因为num是0,然后吧值赋给num,num现在就是1了
进入第二次前会判断上次输入的是不是回城,是回车就退出循环,这里输入的是1,满足条件进入第二次
这时候num是1
我第二次输入的是2
满足是1-9的条件
num现在等于1*10+2也就是12
进入第三次循环,,我输入3
num等于12*10+3 也就是123
进入第四次循环
我输入的是回车
不满足1-9的条件
进入else
判断num有没有值,现在num=123
满足条件,退出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-23 09:01:26 | 显示全部楼层
首先要明白ch是字符对吧。
‘0’看到外面的单引号了吗?就是ASCII表里的数字0,同理,‘9’就是数字9。所以if的意思就是说假设ch为数字0—9,那么可以进入if内部语句。
num = 10 * num + (ch - '0');这个就厉害了,前面的num我就不说了,不就是*10变得高位,比如说11,你拆开是2个1,拿到一个1的时候*10,再加上另一个1(唉,不说又说了)。后面+的就是低位,因为ch是字符,0—9对应的ASCII码是48—57,要是不减去‘0’就会直接拿对应的48—57来计算,答案肯定是大了很多。所以,减去基值,就是48,也就是‘0’,就得到数字了,如:‘1’-‘0’就是ASCII码的49-48=1,刚好对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-23 09:06:06 | 显示全部楼层
if (ch >= '0' && ch <= '9') //这个是判断,ch字符是否是0~9之间的字符
           num = 10 * num + (ch - '0'); // num应该是之前定义好的变量进行运算
//其中 (ch - '0') 将会得到一个0~9之间的数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-23 12:47:07 | 显示全部楼层    本楼为最佳答案   
首先,获取一个输入字符,判断是不是字符'0'-'9'(if (ch >= '0' && ch <= '9') ),这里的&&表示如果不满足ch >= '0'那么就不判断了,因为判断ch <= '9'没有意义,然后如果是数字(num的初始化的值应该是0),那么吧原来num的值乘以10,再加上输入的值,这里用 (ch - '0')获取到输入的数值,因为ASSIC码里面的数字字符都是顺序的,所以输入的这个字符只要是数字,那么它减去‘0’得到的就是所需要的值,比如‘8’-‘0’=8(前面两个是字符类型,得到的结果是int类型),终于后面的else,表示如果num的值不等于0,那么就退出循环,好像有点复杂的样子

我们走一下流程吧,这里假设输入123回城
首先进入while循环,获取输入
得到第一次输入的是1,这时候num=0,
判断输入的是字符1,条件满足,于是num*10+1 =1因为num是0,然后吧值赋给num,num现在就是1了
进入第二次前会判断上次输入的是不是回城,是回车就退出循环,这里输入的是1,满足条件进入第二次
这时候num是1
我第二次输入的是2
满足是1-9的条件
num现在等于1*10+2也就是12
进入第三次循环,,我输入3
num等于12*10+3 也就是123
进入第四次循环
我输入的是回车
不满足1-9的条件
进入else
判断num有没有值,现在num=123
满足条件,退出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-28 18:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表