1613551 发表于 2022-4-7 13:37:14

有人能解释一下这道题吗

本帖最后由 1613551 于 2022-4-7 13:38 编辑

小甲鱼这课后作业真是越来越难了,有人能解释一下下面标出来的那一段代码是什么意思吗?题目如下图



#include <stdio.h>

int main()
{
      int ch;
      int num = 0;

      printf("请输入待转换的字符串:");

      do
      {
                ch = getchar();

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

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

      printf("结果是:%d\n", num);

      return 0;
}

ba21 发表于 2022-4-7 13:43:51


mum=0, ch =1
num = 10 * num + (ch - '0') = 0+ 1 = 1

mum=1,ch =2
10 * num + (ch - '0') = 10 + 2 = 12

解析:
10 * num 实现右移位

(ch - '0') 实现把当前字符转整

合在一起就是题 义。

x3322699 发表于 2022-4-7 14:56:24

本帖最后由 x3322699 于 2022-4-7 15:07 编辑

去看一下,ASCLL码表   调试来看每次循环里ch(这里会进行隐式转换)里的值是多少   10 * num    第一次循环是存个位,第二次会存十位,....然后存百位存千位。。。。      (ch - '0') 实现把当前字符转整   前面那个if会只转'0'...'9'之间的数字去看看'9' -'0'会变成什么
ASCLL码表 能自己手动算算,更好理解。

1613551 发表于 2022-4-7 16:10:56

ba21 发表于 2022-4-7 13:43
mum=0, ch =1
num = 10 * num + (ch - '0') = 0+ 1 = 1



前面的看懂了,后面(ch - '0') 实现把当前字符转整我还是理解不了,为什么这样子可以转整啊

1613551 发表于 2022-4-7 16:15:30

x3322699 发表于 2022-4-7 14:56
去看一下,ASCLL码表   调试来看每次循环里ch(这里会进行隐式转换)里的值是多少   10 * num    第一 ...

救命,我还是理解不了,可能等我学到后面再回头看就能看懂了吧

ba21 发表于 2022-4-7 16:15:40

1613551 发表于 2022-4-7 16:10
前面的看懂了,后面(ch - '0') 实现把当前字符转整我还是理解不了,为什么这样子可以转整啊

'1'-'0' 等于多少不知道? 去找下ascii码表

一阵三十六 发表于 2022-4-7 17:16:50

ch 对应 字符'0' - '9'的ascii码
'0''对应 48
‘1’对应 49
以此类推
ch - '0' 得到了一个数,这个数就是赋值给ch的字符
举个例子:
ch = '2',这个时候 ch 的 值是 50 即 ch = 50
ch = '2' 等价于 ch = 50
ch - '0' 就得到了 2

num *10 就代表把之前获得的数字扩大十倍,
比如:12
num = 10*0 +1
num = 1
然后
num = 10*1+2
num = 12

1613551 发表于 2022-4-8 09:34:28

一阵三十六 发表于 2022-4-7 17:16
ch 对应 字符'0' - '9'的ascii码
'0''对应 48
‘1’对应 49


牛逼,这个一看就懂了
页: [1]
查看完整版本: 有人能解释一下这道题吗