C语言基础——分支与循环结构(一)
在前文中,我们简单介绍了C语言有三大结构:顺序结构、分支(选择)结构、循环结构,从本章节开始我们对此进行详细介绍。
在C语言中,语句可以分为以下五类:
(1)表达式语句 (2)函数调用语句 (3)控制语句 (4)复合语句 (5)空语句(;)
if语句
下面我们来从单选择、双选择、多选择来分别阐述if语句的使用方法。
(1)单选择:
if(表达式){ 代码块;}后续代码;解释:如果表达式为真,则执行代码块,否则不执行代码块,执行后续代码。
举例:判断19是否是3的倍数。
(2)双选择:
if(表达式){ 代码块1;}else{ 代码块2;}if(表达式1){ 代码块1;}else if(表达式2){ 代码块2;}else if(表达式3){ 代码块3;}else{ 代码块4;}如果表达式1为真,则执行代码块1,否则判断表达式2 如果表达式2为真,则执行代码块2,否则判断表达式3 如果表达式3为真,则执行代码块3,否则执行后else中的代码块4。
注:众多的大括号中,只有一个大括号的代码块会被执行。
若前面添加的所有判断条件(else if)都不满足,才会执行else中的内容。
举例:给出一个人的BMI(体质指数)(中国标准),判断他的体质类别是哪一种。
#include <stdio.h>int main(){ int i = ; scanf("%d", &i); if (i < 18.5) { printf("偏瘦\n"); } else if (i >= 18.5 && i < 24) { printf("正常\n"); } else if (i >= 24 && i < 28) { printf("超重\n"); } else if (i >= 28 && i < 30) { printf("肥胖\n"); } else if (i >= 30 && i < 40) { printf("重度肥胖\n"); } else { printf("极重度肥胖\n"); } return ;}以上为示例结果,这里只作为演示,上述代码段可以将i的类型改为float类型,因为笔者使用的int(整形)并不能输入小数(可以输入小数,但是结果错误)。
输入格式也要从%d换成%f。
(4)if嵌套:
if中可以继续嵌套if, else中也可以继续嵌套if。
if (表达式1) { 语句块1; if (表达式2) { 语句块2; }}else { if (表达式3) { 语句块3; } else { 语句块4; }}举例:
要求用户输入一个分数,根据输入的分数输出对应的等级
80~100
良好 70~79
及格 60~69
不及格或输入错误 0~59
下面进行一些举例:
#include <stdio.h>int main() { if () if (1) printf("A\n"); else printf("B\n"); else if (1) printf("C\n"); else printf("D\n");}读者朋友们可以思考一下这段代码的结果。
根据我们上面叙述过的内容,如果表达式的值为零,语句不会执行,若非零,则执行语句。当if else后面的大括号被省略时, else会自动和距离近的一个if匹配。
面对这样的代码,我们可以将相互匹配的if、else打上{}
#include <stdio.h>int main() { if () { if (1) printf("A\n"); else printf("B\n"); } else { if (1) printf("C\n"); else printf("D\n"); }}这样能够更好地理解,也间接展现了一个良好的代码风格的重要性。所以if(0)为假,执行else中的代码块,因为if(1)为真,所以输出C,结果为C。
下面我们再举几个例子
#include<stdio.h>int main(){ int age = 20; if(age>=18) printf("成年\n"); else printf("未成年"); printf("不可以上网吧");}这里为什么age=20,还不可以上网吧呢?
当if、else、else if后面的大括号被省略时,条件成立就执行距离条件近的语句,所以else控制的只有第9行。
下面我们再举一个例子:
#include<stdio.h>int main(){ if (1 > 2); { printf("1 > 2"); } return ;}下面我们再来举一个例子:
#include<stdio.h>int main(){ int a = 8; if (a = 10) { printf("Test\n"); printf("%d", a); } return ;}请思考输出结果,结果如下:
这里我们需要注意:
“=”:表示赋值运算符,表示将“=”右边的值赋值给左边。
双等号“==”是逻辑判断运算符,表示将“==”左右的值进行比较。
所以当我们遇到比较一个常量等于或者不等于某一个常量的时候,可以将常量放在前面。(良好代码风格)
对if语句的一些补充:
if(条件表达式)其后没有分号。一般来说,有"{}"就没有";",有";"就没有"{}" if语句所控制的语句如果是一条语句,我们可以不写大括号。 如果控制的是两条以上的语句,必须加大括号。 if语句的控制体没有加大括号是其后跟的一条语句。
该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如:if(a=5) 语句;if(b) 语句;都是允许的。只要表达式的值为非0,即为“真”。如在:if(a=5)中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
switch语句也是一种分支语句。常常用于多分支的情况。
当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。
switch语句使用格式:
switch (表达式) {case 常量表达式1: 语句1; break;case 常量表达式2: 语句2; break;case 常量表达式n: 语句n; break;default: 语句n + 1; break;}语义:
#include <stdio.h>int main() { int a; printf("Input integer number:"); scanf("%d", &a); switch (a) { case 1: printf("Monday\n"); break; case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; case 7: printf("Sunday\n"); break; default:printf("error\n"); break; } return ;}结果示例:
可以看见,当我们输入1时,也就将1赋给了变量a,对应着case1,于是输出了Monday。
当我们输入8时,与所有的case后的常量表达式均不相同,于是执行default下的error。
switch注意事项如下:
switch条件表达式类型必须是整形,或者是可以被提升为整形的值。
case的值只能是常量(常量表达式),并且必须是整形,或者是可以被提升为整形的值(指char、short)。例如case 'a'。
case的值不能重复,例如在一段switch中出现两个case1。
switch中,default可以省略,default也不需要放在所有的case之后,只有与所有case不匹配后才会执行default。
这里读者朋友们可能会对break、default感到疑惑,现在我们来解释。
break语句(四大跳转语句之一)
break 在一些计算机编程语言中是保留字,其作用大多情况下是终止所在层的循环。在 C语言 的 switch(开关语句)中,break 语句还可用来在执行完一个 case(分支)后立即跳出当前 switch 结构。在某些程序调试过程中则使用break设置断点。
break语句的特点:
break如果用于循环是用来终止所在层循环的; break如果用于switch,则是用于终止switch; break不能直接用于if,除非if属于循环内部的一个子句;
像这里,当switch(1)已经与case1匹配,所以剩下的case与default失效(不具有匹配效果),内部的语句都会执行,直到遇到break或者将整体的switch语句执行完毕,才会结束。
举例:
当我们在case5后加上break,虽然我们输入的是1,但是遇到了break,在case5的Friday后停了下来。
这里请读者朋友们思考一下,既然我们知道了break的作用,那我们如果想实现输入1-5输出weekday,输入6-7输出weekend,该怎么做呢?
代码如下:
#include <stdio.h>int main(){ int day = ; switch (day) { case 1: case 2: case 3: case 4: case 5: printf("weekday\n"); break; case 6: case 7: printf("weekend\n"); break; } return ;}break语句的实际效果是把语句列表划分为不同的分支部分。
在每个switch语句中都放一条default子句是个好习惯,甚至可以在后边再加一个break。
switch语句也是一个典型的以空间换时间的例子。
Q:那么,我们什么时候用if,什么时候用switch呢?
至此我们已经了解分支(选择)结构的大致内容。
编辑: 霖海岛LHaisland
审核: 霖海岛LHaisland
图文来源: 霖海岛LHaisland
相关文章