S1E13作业疑问
如下图红圈所指,个人较难理解,求解答。除此之外,为什么这里不能写成num = ch - 48('0')。(ps:括号都为注释,错误指值错误)
还有,要是在if循环体中用printf输出结果,输出结果错误,但在循环体外输出却正常。 本帖最后由 jackz007 于 2020-11-18 01:20 编辑
. . . . .
num = 0 // 初始化 num 为 0
do {
ch = getchar() ;
if(ch >= '0' && ch <= '9') // 如果 ch 是数字字符
{
num = num * 10 + ch - '0' ; // 结合前期 num 求取新值
} else { // ch 不是数字字符
if(num) // 如果 num 已经是非零值
{
break ; // 那就结束循环
}
}
} while(ch != '\n') ; // 如果 ch 不是换行(回车)字符,那就继续循环
. . . . . .
假设键入的字符分别是 '9','2','7', '5' ,'\n',那么,do ... while 将会循环 5 次,下面进行展开
第一次:num = 0 , ch = '9' --> num = num * 10 + ch - '0' = 0 * 10 + '9' - '0' = 9
第二次:num = 9 , ch = '2' --> num = num * 10 + ch - '0' = 9 * 10 + '2' - '0' = 92
第三次:num = 92 , ch = '7' --> num = num * 10 + ch - '0' =92 * 10 + '7' - '0' = 927
第四次:num = 927, ch = '5' --> num = num * 10 + ch - '0' = 927 * 10 + '5' - '0' = 9275
第五次:num = 9275 , ch = '\n'--> ch 是非数字字符,而且,num 值非零,循环结束
这样,最终通过键盘得到了整数 9275。 num = 10 * num + (ch - '0') 这么来理解:减 ‘0’ 是把 ASCII 码转成数字,乘10就是将数字的个位这个位置空出来。比如数字 8,它现在占着个位的位置,如果乘以 10,就变成了80 了,8 就变成了十位上的数了,个位就空出来了,后转换的数 (ch - '0') 就可以在个位上了 jackz007 发表于 2020-11-18 01:17
假设键入的字符分别是 '9','2','7', '5' ,'\n',那么,do ... while 将会循环 5 次,下面进行 ...
这个地方我一直有一个疑问,对于ch = getchar()在循环体内,它不是获取一个字符吗,那它(getchar())不是要先执行过循环体内的全部语句后才能再执行一次它吗,但执行程序的时候,它不是一次次的执行而是等我输入完我要输入的全部字符再执行。实质并不跟我想的一样。
就拿这题作例子,来解释我想表达的意思:
我画红圈的地方我写成num = ch - '0',后再补上printf("%d",num),能达到作业要求的同样的效果。
我设想的:输入q -->不打印 -->再输入1 --> 打印1 --> 再输入2 --> 打印2 -->再输入 a --> 不打印(结束)
此效果可参考python while 的效果。
(大概)实质: 输入qrqw124qrwr --> 打印124
我猜想可能getchar()是可接收并积累成多个字符的形式,while语句中相当于迭代出它积累的字符并依次判断后,最后再全部打印出来。(我有点无法理解,无法完整表达我所想的,求谅解)
逆鳞丶樱之羽 发表于 2020-11-18 22:23
这个地方我一直有一个疑问,对于ch = getchar()在循环体内,它不是获取一个字符吗,那它(getchar())不是 ...
getchar() 是带缓冲的键盘输入,就是说,并非每输入一个字符就会直接反馈给程序,而是用户输入的字符会先在键盘缓冲区保留,只有等到按下回车键的时候,getchar() 才会分多次把用户键入的所有字符反馈给程序。也正是因为这个原因,你的代码无法实现预期的交互式的输入输出的效果。
页:
[1]