tucc 发表于 2021-12-5 17:57:44

为什么输入数字才会执行语句A,大哥救我

……
while ((ch = getchar()) != '\n')
{
      if (ch < '0' || ch > '9')
                continue;
      // 语句A
}
…………

嘉岳呀 发表于 2021-12-5 18:01:36

这个判断的意思是:如果这个字符的ASCII码不在0~9(也就是数字)范围内,那么后面的内容省略,进行下一次循环

输入数字的话就不会 continue了

jackz007 发表于 2021-12-5 18:12:16

      这个代码改写一下就容易理解了
…………
while ((ch = getchar()) != '\n')
{
      if (ch >= '0' && ch <= '9') {
                语句A
      }
}
…………
      这个代码和楼主代码的执行逻辑一模一样。

lightninng 发表于 2021-12-5 20:21:51

这个问题的关键点有两个
1、if语句中的ch < '0' || ch > '9'是什么意思
2、continue的作用

第一个问题if语句中的逻辑判断ch < '0' || ch > '9'是什么意思,它其实是用char型变量ch的ascii码值与字符'0'和字符'9'的ascii码值作比较,当ch的ascii码值小于'0'的ascii码值,或者大于'9'的ascii码值时,逻辑判断为真,否则为假。所以,意思就是当你输入的字符ascii码不是'0'到'9'的ascii码之间时,为真,否则为假,
https://baike.baidu.com/item/ASCII/309296?fr=aladdin
上面的百度百科中可以看到字符'0'的ascii码是48,'9'的ascii码是57,可以看到从48-57正好是字符'0','1'....'9',所以,上面的判断语句意思是当你输入的不是数字时为真,是数字时为假


第二个问题,continue的作用,continue语句的作用是,跳过当前循环中剩下的部分,直接开始下一次循环,用你贴的这一段语句为例
根据第一个问题的讨论我们知道,当输入的不是数字时,会执行if语句后面的continue,这时将直接跳过所有while循环中continue后面的语句(也就是语句A)。当你输入数字时,if语句后面的continue由于条件判断为假而不会被直接,于是就会接着执行下面的语句A

tucc 发表于 2021-12-5 23:10:04

lightninng 发表于 2021-12-5 20:21
这个问题的关键点有两个
1、if语句中的ch < '0' || ch > '9'是什么意思
2、continue的作用


如果我输入的数字不是0-9,而是12或者22会怎么样

lightninng 发表于 2021-12-5 23:34:26

本帖最后由 lightninng 于 2021-12-6 15:02 编辑

tucc 发表于 2021-12-5 23:10
如果我输入的数字不是0-9,而是12或者22会怎么样
getchar()方法有点特殊,它的返回值是当前字符缓冲区中第一个字符。
1、当缓冲区中没有字符时会从键盘获取字符,然后把输入的所有字符(回车表示输入完成)都放入缓冲区,然后返回缓冲区第一个字符
2、当缓冲区有字符时,会直接返回缓冲区第一个字符,而不会让你从键盘输入
#include<stdio.h>
#include<conio.h>
void main()
{
    char c;
    while ((c=getchar())!='\n')    /*每个getchar()依次读入一个字符*/
      printf("%c",c);      /*按照原样输出*/
    printf("\n\n");
}

运行一下上面的程序,然后试试各种不同的输出是什么效果,以及为什么是那样的效果,注意,你的回车也被放入了字符缓冲区中
具体解释请看
http://bbs.bccn.net/thread-232014-1-1.html
页: [1]
查看完整版本: 为什么输入数字才会执行语句A,大哥救我