一、什么是语句
C语言的语句可以分为以下五类:
1.表达式语句(语句必须有分号,任何一个表达式语句加上;就成了表达式语句)
2.函数调用语句
3.控制语句(用于控制程序的执行流程,以实现程序的各种结构方式,他们由特定的语句定义符组成,C语言有九种控制语句。可分为以下三类:)
a. 条件判断语句也叫分支语句:if语句、switch语句;
b. 循环执行语句:while语句、for语句、do while语句;
c. 转向语句:break语句、goto语句、continue语句、return语句;
4.复合语句(用 { } 将若干语句包括起来而构成的语句)
注:a. 复合语句是单条语句,而不是多条语句;
b. if选择结构或者循环结构要用到复合语句;
c. 复合语句{}外面不要有;
d. 复合语句{}里每一句都要加;
5.空语句( ;无任何操作,但合法,可用于循环中的延时,有些地方需要有一个语句占位等)
二、分支语句(选择结构)
1. if语句
1.1 if语句的语法结构
单分支: 双分支: 多分支:
if (表达式) if (表达式) if (表达式1)
语句; 语句1; 语句1;
else else if(表达式2)
语句2; 语句2;
else
语句3;
上面的语法结构中,其实每个语句可以用大括号括起来,原因是如果if或者else后面要执行的可能不止一句,用大括号将所以要执行的语句括起来,这样就可以完美的执行代码,当然了,如果要执行的语句只有一条,那么可以如同语法结构那样不加大括号。
注:在C语言中非0就是真,if后面圆括号中的表达式是非0,语句就能执行。(写代码规范性-推荐看《高质量c/c++编程》前三章))
例:a. 判断年龄,如果年龄大于18,就输出成年
b. 如果年龄大于18,就输出成年,否则就输出未成年,不能谈恋爱
c. 再提升一下,判断少年(18岁以下)青年中年老年几个阶段
1.2 悬空else
else默认和离他最近的if相匹配,而且我们也要意识到写代码规范的重要性,适当的使用{ }可以使代码的逻辑更清楚。
else与第二个if相匹配,共同构成第一个if的子语句。第一个if表达式不成立,所以程序直接跳出if这个分支语句,跳过了第二个if,自然也就没有执行else语句,其实如果我们把这段代码复制到编译器上就会发现else是默认跟第二个if对齐的。
我们适当的使用了{ },既避免了出错,又使代码更加美观。
1.3 if书写形式的对比
对比一下四种代码的书写形式,我们会发现代码2和代码4更好,逻辑更加清晰,对比1,2,我们很容易发现代码2书写更好,那为什么对比3和4,代码4更好呢?这是因为代码4中,if表达式中常量在左,变量在右,这样可以防止将等于号==错写成赋值号,却无法找到错误。
1.4 练习
1.判断一个数是否为奇数
2.输出1-100之间的奇数
2. switch语句
2.1 switch语句
我们发现,如果分支语句太多,用if...else if...else if.....的形式太复杂了,这时候用switch语句就会更加简单。
switch语法结构:
switch(整型表达式)
{
case 整型常量表达式:
语句;
.......
}
代码1:
为什么每个case的后面加上break,是因为在执行对应的case语句后,就跳出switch分支语句,如果没有加上break,那么程序会继续执行后面的case语句,只要再次遇见break语句为止,才跳出switch分支语句。
代码2:
如果几个case对应的结果都是一样的,如上代码所示,那么这个时候就不用每个case都加上要执行的语句,只需要在对应结果相同的最后一个case后面加上要执行的语句即可。
代码3:
最后的defalut,其实是可以省略的,只不过如果当我们输入的数字在switch分支语句中,没有找到对应case的时候,可以打印一个输入错误作为提醒,当然了break不能少。
而且这个default语句可以放在分支语句中的任意位置,这个不影响代码的运行。(最好放在语句最后)
养成一个编程好习惯:在每一个Switch语句中添加一个default语句。
2.2 练习
下面代码输出的结果是什么?
三、循环语句
1.while语句
1.1 while循环的语法结构
不管是if语句还是switch语句,当条件满足的情况下,都只能执行一次。
但是很多时候我们知道同一件事情需要完成很多次,这个时候就要用到循环语句,首先介绍while语句。
while的语法结构:
while(表达式)
{
循环语句;
}表达式为真,则执行循环语句,循环一次后,第二次判断表达式的真假情况,直到循环到表达式为假的时候,就不再执行循环语句,这时候跳出循环。
用流程图如下:
在屏幕上打印1-10的数字:
我们和前边的if语句结合一下,要求它打印3个换行再打印:
1.2 while语句中的break和continue
a. break语句
while循环语句中如果执行了break语句,那么就是会中止循环,这时候就跳出了循环。如上代码所示,当循环到 i 等于5的时候,就会执行if后的break语句,所以代码运行的结果如上。
总结:break在while循环中的作用:
其实在循环中只要遇见break,就停止后期的所有循环,直到终止循环。所以:while中的break是只用于永久终止循环的。
b. continue语句
这是为什么呢?这是因为i == 5 的时候,continue跳出了本次循环,后边的语句也没有执行,所以i++并没有被执行,然后开始进入下一次循环判断,i还是等于5,所以程序陷入了死循环,i一直等于5。
总结:continue在while循环中的作用:
其实在循环中只要遇到continue,也就是本次循环中的continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
2.for循环
2.1 for循环的语法结构
对于循环语句来说,用的最多的是for循环,再就是while循环,用的最少的是do while
for语法结构
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1为初始化部分,用于初始化循环变量的。表达式2为条件判断部分,用于判断循环时候终止。表达式3为调整部分,用于循环条件的调整。注意:表达式之间用的分号 ;相隔。
for循环的执行流程:
练习:使用for循环,在屏幕上打印1-10的数字
通过for的循环流程图可知,一般进入for循环,先初始化,然后判断,判断为真,进入循环语句,然后进行调整,接着再进行判断......,直到判断出现为假,就跳出循环。
可以发现,在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改不够集中和方便。所以,for循环的风格更好,for循环的使用频率也是最高的。
2.2 for循环中的break和continue
在for循环中也有break和continue,他们的意义和while循环中是一样的,但是还是有些差异。
a. break语句
当i=5时,执行break语句,for循环中遇到break,和while中的break一样,就会终止循环。
b. continue语句
我们可以发现,for中的continue并没有像while那样在i ==5的时候陷入死循环,这是因为i == 5的时候,执行continue,跳过本次循环,i++变成了6,后边的循环仍然可以正常运行。
2.3 for 语句中的循环控制变量
1.不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
2.4 一些for循环中的变种
代码1:
代码2:
代码3:
分析:当i=0满足i<3,进入循环体,j=0满足j<3,进入循环体打印,然后j++,当j=3时不满足条件退出循环,此时已经打印出三个hehe,然后i++,此时j未被初始化,j还是等于3,不符合j<3,最后只能得到三个hehe。
代码4:
2.5 练习
答案是0次,因为k=0是赋值,k被赋值为0,0为假,循环不执行。
3. do…while()循环
3.1 do…while()循环的语法结构
格式: do
{
循环语句;
}
while(表达式)
执行流程:
do...while()语句和其他循环语句不一样的地方在于do...while()语句是先执行再判断。
注:do...while语句的循环体至少执行一次。
打印1-10:
3.2 do..while语句中的break和continue