1、C语言是结构化的程序设计语言
2、C语言中有3种结构:顺序结构、选择结构、循环结构
一、什么是语句
C语言中由一个分号 ; 隔开的就是一条语句。
二、分支语句(选择结构)
if语句:
语法结构:
下面我们再来看这样一个代码:
age 就是10啊,不在18与30之间啊,为什么还会打印出 青年 呢?
别急,原因是这样的:18<=age,条件是假,就是0;0<30,条件一定是真的,所以就打印出了 青年。因此,在C语言中,要想满足18<=age<30,应该写成:18<=age && age<30哦。
说明:在C语言中,0表示假,非0表示真。
猜猜看下面的代码打印出什么结果?
实际上打印出的结果是:
这个结果你猜对了吗?
实际上,if语句中,单条语句可以直接书写,而多条语句则需要用{ }给括起来才可以,否则的话就会执行if下面的第一条语句。
举例说上面的代码,不管age的值是不是大于18,可以谈恋爱了肯定会被打印出来了。
悬空else:
让我们再看一看这样一个代码:
编译结果:
什么都没有打印,是不是感到晕乎乎的。原来,这个是else的匹配规则——else与距离最近的if进行匹配。
所以说,良好的代码风格非常重要哦。
上面的代买就可以改成这样就一目了然了:
下面我们再来看一看这个代码:
编译起来的结果是这个吖子滴:
同学们就会发现,这是咋回事啊,怎么还打印出来 呵呵 呢?
= 赋值的意思
==判断是否相等
同学们把赋值和判断搞混淆了,num=5,5是非0的数为真,所以打印出来了。
switch语句:
switch 语句也是一种分支语句。 常常用于多分支的情况。 很明显,这种代码就写得非常的长,感觉不是写的很好。 因此,switch语句就上场了:当然,如果case后面的语句比较复杂,需要用{ }给括起来也是没有任何问题的:
说明:
1. switch后面的( )里面的值必须是整型表达式的值;case后面的值必须是整型常量表达式的值(当然字符也是可以的,字符底层存储的也是ASCII码值)。
2.break是实现分支的真正要义之所在(switch的入口是case,出口是break;break的作用是直接跳出
当前的switch语句,不执行后续操作)。
3.当然,并不一定所有的case后面的都要加上break:
4.default 的用法是:当所有的case中整型常量表达式的值都不满足时,执行default中的语句;并且default可以出现在case语句的任何地方(只不过一般上习惯把default放在后面)。
其实,switch是可以嵌套使用的,下面我们来看一下这个例子:
聪明的你是不是已经知道代码的运行结果了呢?
三、循环语句
常见的循环语句有:while循环、for循环、do...while循环,下面我们会慢慢介绍这些循环结构:
while循环:
下面我们来看这样一个例子:
由此可以知道,if语句只循环了一次;
现在,将if改成while试试看编译结果:
由此可见,该语句进入了死循环。
while(表达式),当表达式为真时,就会一直执行下面的语句,直到表达式为假。
while循环的执行流程(举个例子)
执行的流程是:1->2->3->1->2->3......
有的时候我们在循环里头会看见这两个小东西:break、continue,那么,这两个小东西到底有什么作用呢?
break在while循环里面的作用:
原来的代码如果没有break,就直接打印出1 2 3 4 5 6 7 8 9 10的结果,而加了break以后,却只打印了1 2 3 4 的结果。这是怎么回事呢?
原来,在循环语句里遇到break,就直接终止了循环,直接跳到了循环体的外头(打印了1 2 3 4 以后,i=5时if条件成立,就会执行break语句,由1语句直接跳到了2语句)。
continue在while循环里面的作用:
由图可知,编译结果是:1 2 3 4 死循环,这是为什么呢?
原来,continue的作用是:跳过本次循环(后面的代码不会执行了),直接跳到判断部分,判断下一次的循环是否会执行(打印出1 2 3 4 以后,i=5时,执行continue语句,直接跳到判断部分;然后i还是5,继续......就一直死循环下去了 由1语句跳到了2语句)。
getchar() 和 putchar()函数:
getchar():从键盘获取字符
putchar():把字符打印到屏幕
当然,getchar和scanf还是不一样的(getchar是用来接收字符的,scanf可以接收好多东西,接收字符的是一样的)
为什么获取字符的要放到int 里面去呢?
原因有两点:1、返回的字符,本质是字符也是ASCII码值,是整数;
2、getchar函数不仅仅返回正常字符还会返回EOF(是-1),所以放在整型变
中。
说明:1、EOF:end of file 文件结束标志;
2、getchar读取失败的时候就会返回EOF;
3、键盘输入:Ctrl+Z就会退出去。
应用场景:
按理来说,有两个步骤:输入密码,进行确认;
但是,结果却是这样的:输入密码后,回车,直接是确认失败:
为什么是这样呢?实际上这是输入缓冲区的原因:
像scanf、getchar这样的函数,在读取数据的时候其实是从输入缓冲区读取的。首先,scanf获取信息,先看输入缓冲区,什么都没有,就等待着键盘上输入的东西 abcdefn ,这时候scanf才把缓冲区里面的 abcdef 拿走,存储在password中,缓冲区里面还有一个 ;getchar读取数据的时候,发现缓冲区里面还有 n ,就直接把它拿走了,放进了ch中,不会再等待。
如果想要这个效果,就需要这样做:
这样子就可以等待了;
不过也是不可取的,因为这个只能解决缓冲区只有一个n的问题:
输入密码以后回车,就直接出现了失败。
为什么呢?其实非常简单:和上面的分析过程差不多,不过,scanf用%s读取数据的时候,碰到空格就不读了,剩下的就不仅仅只有上面的n了,还有 空格123456n,getchar先把空格读取走,下面的getchar就读取了1(getchar一次只能读取一个空格),然后就只能确认失败了(当然,以后如果想要一个密码带有空格的,就需要把scanf函数换成gets函数,这里就不再过多赘);述要想彻底解决这个问题,则需要这样做(因为不管输入什么密码,最后一个肯定都是n);
scanf
输入部分中间有空格
然后监视窗口到了空格部分以后就没有输入上去了,并且空格部分用了一个



