Poedu_C语言_Lesson20_20160923_分支语句
来源:互联网 发布:潜泳技巧 知乎 编辑:程序博客网 时间:2024/05/21 12:00
1.对于if语句:单独使用if 和只循环一次的while没什么区别,但是和else联合起来用,就能达到while达不到的效果
2.我们的代码中会出现if等分支语句,那么,计算机中是怎样执行判断的呢?首先,来看一段简单的代码:
在这段代码中,我们做了一个简单的判断,下断点,运行程序,转入反汇编:
反汇编中,在对值进行比较后,出现了一个jge指令,那么这个jge指令是干嘛的呢?应该是来控制语句时顺序执行还是执行else里面的,那么它是怎么判断的呢?
在讲jge之前,先来了解标志寄存器,标志寄存器(FLAG)属于寄存器的一种,前面的计算机基础那边有提到过。
=>标志寄存器中有个标志位(EFL),这个标志位一共有32位,每一位都有特殊的含义
=>比如:汇编指令cmp是通过符号标志位(SF)来计算的,在SF的第7位(从0开始),有1和0两种状态,如果这个位
上为0,那么jge就可以接收到这个信息,执行跳转语句,否则就是顺序执行,所以jge常常与cmp一起使用
3.
while(scanf(...) ==0 ){
...
}
为了接收到有效输入,因此用了while循环,但是会出现问题,当缓冲区里有数据的时候,scanf不会进行数据的接收
=>解决办法:清空缓冲区
=>有一个函数来做这件事情的fflush(stdin); (这里的stdin指的是标准键盘输入流)
==>但是fflush很多地方不支持,所以不建议使用这个
=>用getchar(); getchar()这个函数会从stdin中读取一个字符
=>但是一个getchar只能读取一个字符,缓冲区里有很多的话,还是会有数据存在,用while
=>判定条件时当getchar()==EOF时会读取完毕。但是,只有这一个条件的时,看上去是没问题,其实达不到你想要的清空缓冲区的效果,因为我们平常输入的最后一个字符一般是回车(也就是'\n'),我们把这两个条件加一起就可以了,代码应该是这样的:
void ClearBuf()
{
char cTmp=0;
while((cTmp==getchar()) != EOF && cTmp!='\n');
return;
}
这样就能达到清空缓冲区的效果了
=>有一个我在使用时遇到的问题,如果你在没有任何输入时,也就是程序刚启动时就进行清空缓冲区,会让你的程序卡在这里动不了,陷入上面这个死循环,所以,如果你有清空缓冲区的要求,请记得在每一次的输入过后再调用这个程序,这样同样能保证下一次接收输入的时候,缓冲区里是干净的。
=>如果用getch替换getchar可行么?都是接收输入的啊。答案是不行。因为getch它是直接接收键盘输入的一个字符,不会等待\n(也可以认为getch它是不认\n的),那么它就会认为你的缓冲区是干净的,就会发生上面所说的,陷入这个死循环。所以,记得要用getchar进行缓冲区的清空。
- Poedu_C语言_Lesson20_20160923_分支语句
- Poedu_C语言_lesson11_20160911_char类型
- Poedu_C语言_lesson12_20160911_小数
- Poedu_C语言_20160912_复习
- Poedu_C语言_lesson13_20160912_字符串
- Poedu_C语言_lesson15_20160914_printf详解
- Poedu_C语言_lesson14_20160913_常量
- Poedu_C语言_lesson16_20160916_scanf详解
- Poedu_C语言_lesson19_20160920_循环
- Poedu_C语言_lesson09_20160908_编程概述
- Poedu_C语言_lesson10_20160909_整数类型
- Poedu_C语言_Lesson21_20160924_函数1
- Poedu_C语言_lesson22_20160927_函数2
- Poedu_C语言_lesson23_20160928_函数3
- Poedu_C语言提升_Lesson01_20161108_数据类型
- Poedu_C语言提升_Lesson04_符号
- 【C语言】if分支语句
- Poedu_C语言_lesson08_20160906_第一个程序
- GCD Dispatch Sources
- realloc,malloc,calloc的区别
- NVIDIA JETSON TX1 开发者套件环境配置
- 抽象类
- FOF管理系列之一:什么是FOF?
- Poedu_C语言_Lesson20_20160923_分支语句
- Mybatis 异常: The content of elements must consist of well-formed character data or markup
- spark1.6+hadoop2.6集群HA搭建与参数解析
- HttpClient
- 烧脑电影:彗星来的那一夜(Coherence)
- Kotlin基础语法-属性(Property)与域(Field)
- input默认值设置
- 去除小数点
- cas源码改造-添加验证码(com.google.code.kaptcha)