鱼C论坛

 找回密码
 立即注册
查看: 1154|回复: 5

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

[复制链接]
发表于 2021-12-5 17:57:44 | 显示全部楼层 |阅读模式

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

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

x
……
while ((ch = getchar()) != '\n')
{
        if (ch < '0' || ch > '9')
                continue;
        // 语句A
}
…………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-5 18:01:36 | 显示全部楼层
这个判断的意思是:如果这个字符的ASCII码不在0~9(也就是数字)范围内,那么后面的内容省略,进行下一次循环

输入数字的话就不会 continue了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-12-5 18:12:16 | 显示全部楼层
        这个代码改写一下就容易理解了
…………
while ((ch = getchar()) != '\n')
{
        if (ch >= '0' && ch <= '9') {
                语句A
        }
}
…………
        这个代码和楼主代码的执行逻辑一模一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果我输入的数字不是0-9,而是12或者22会怎么样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 05:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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