本章重点学习分支语句和循环语句
分支语句
C语言是一门结构化的程序设计语言
1.顺序结构
2.选择结构
3.循环结构
- if
- switch
循环语句
- while
- for
- do while
什么是语句
C语言中由一个分号:隔开的就是一条语句。比如
printf("hehe");
1+2;
;//是一条空语句
1.分支语句(选择结构)
(1)if语句
那if语句的语法结构是怎么样的呢?
语法结构
if(表达式)
语句:
if(表达式)
语法1;
else
语法2:;
//多分支
if(表达式1)
语句1;
else if(表达式)
语句2;
else
语句3;
课堂演示代码:
代码块
如果条件成立,要执行多行语句,怎应该使用代码块。
课堂演示代码:
悬空else
当你写了这个代码:
如果想要else跟if(a==1)匹配
如果你想else跟if(b==2)匹配
if书写形式的对比( )
如果条件成立返回 x
否则返回 y
比较可得代码2和代码4写的比较好,逻辑更清晰,不易出错。
(2)switch语句
switch语句也是一种分支语句。常常用于多分支的情况
比如:
那我没写成if...else if...else if的形式太复杂,那我们就用switch语句。
switch(整型表达式)
{
语句项:
}
而语句项是什么呢?
//是一些case语句:
//如下:
case 整型常量表达式:
语句;
在switch语句中的break
在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。
switch会直接从case中进入
从break停止结束
case后面的break不是必须要加上的。
break语言的实际效果是把语言列表划分为不同的部分
编程好习惯
在最后一个case语言的后面加上一条break语句。(之所以这么写是可以避免出现以前的最后一个case语句后面忘了添加break语句)
default子句(默认)
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C语言中并不认为适合错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个case标签可以出现的位置。
当switch表达式的值并不匹配所有的case标签的值时,这个default子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default。
编程好习惯
在每个switch语句中都放一条default子句是一个好习惯,甚至可以在后面再加一个break。
2.循环语句
- while
- for
- do while
(1)while
我们已经掌握了,if语句:
if(条件)
语句:
当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。
但是我们发现生活中很多的实际例子是:同一件事情我们需要完成很多次。
那我们怎么做呢?C语言中给我们引入了:while语言,可以实现循环。
exper(表达式) stmt(语句)
在屏幕中输入1~10
while语句中的break和continue
break介绍
其实在循环中只要遇到break,就停止后期的所有的循环,直至终止循环。所以:while中的break是用于永远终止循环的。
continue介绍
总结:continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
再看几个代码
ctrl+z可以获得EOF停下来
getchar()可以接受一个字符并把它放在ch里
putchar跟printf作用相似。
EOF-end of file 文件结束标志
再看一个代码
password-密码 %s是字符串 scanf输入函数,并存放在password数据中
当我们输入密码123456 ABCD时,scanf会读取123456,余下的 ABCD会默认被getchar所读取,为了保证ret=getchar()被影响,导致无法输入Y/N以至放弃确认,所以我们要在其中加入一个while循环将剩余的密码吸收,运行到ret=getchar()时,才可以输入Y/N。
(2)for循环
我们已经知道了while循环,但是我们为什么还要一个for循环呢?首先来看看for循环的语法:
语法
for(表达式1:表达式2:表达式3)
循环语句:
表达式1表达式1为初始部分,用于初始化循环变量的。表达式2表达式2为条件判断部分,用于判断循环时候终止。表达式3表达式3为调整部分,用于循环条件的调整
可以发现现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。
break和continue在for循环中
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中也是一样。但是还是有些差异:
在for1,2,3,4,6,7,8,9,10continue在5时会跳过,调整得很快。 在while1,2,3,4 continue进入死循环。
for语句的循环控制变量
一些建议:
1.不在for循环体内改变循环变量,防止for循环失去控制
对i的调整不要在循环内
2.建议for语句的循环控制变量的取值采用“前区后开区间”写法
一些for循环的变种
变种一 进入死循环
for循环的初始化,调整,判断 都可以被省略
但是,for循环的判断部分如果被省略,那判断条件就是:恒为真。
如果不是特别熟悉,就不要随便省略
变种2 只能打印两个hehe
//请问能循环几次
k赋值=0,循环不进行,所以循环0次。
(3)do while
(1)do语句的语法
do
循环语句:
while(表达式);
(2)do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
执行流程
在do while中的break
在do while中的continue
continue会跳过本次循环后面的代码