Poedu_C语言_Lesson20_20160923_分支语句

1.对于if语句:单独使用if 和只循环一次的while没什么区别,但是和else联合起来用,就能达到while达不到的效果


2.我们的代码中会出现if等分支语句,那么,计算机中是怎样执行判断的呢?首先,来看一段简单的代码:

      Poedu_C语言_Lesson20_20160923_分支语句_第1张图片

在这段代码中,我们做了一个简单的判断,下断点,运行程序,转入反汇编:


Poedu_C语言_Lesson20_20160923_分支语句_第2张图片

反汇编中,在对值进行比较后,出现了一个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进行缓冲区的清空。



你可能感兴趣的:(C_语法,c语言,清空缓冲区,分支语句)