分支与循环语句
1.1 分类
分支语句:
- if
- switch
循环语句:
- while
- for
- do while
go to 语句
1.2 什么是语句
我们可以简单理解:以分号结尾的就是一条语句。C语言中语句可以分为:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
本篇主要介绍控制语句:
控制语句:控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选 择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、go to语句、continue语句、return语句。
1.3 分支语句
1.3.1 if语句
if语句的语法格式:
- if(表达式)
语句;
- if(表达式)
语句1;
else
语句2;
- if(表达式1) //多分支
语句1;
else if(表达式2)
语句2;
else
语句3;
看实例代码:
int main() { int age = 0; scanf("%d", &age); if (age > 18) { printf("成年人\n"); } else { printf("未成年\n"); } return 0; }
这里我们如果输入的age大于18那么就执行if后的条件就判断为真,就执行大括号的语句,否则就执行else大括号内的语句。
那么C语言中,真假如何表示的呢?
C语言中,0为假,非0为真。例如:
int main() { int num = 1; printf("%d\n", num > 10);//打印0 return 0; }
上述代码中,num>10显然不成立,所以表达式的结果为假,也就是0,所以打印0.
int main() { int num = 100; printf("%d\n", num > 10);//打印1 return 0; }
这里num>10成立,所以打印1。
注意:在vs编译器中编译C程序文件时,表达式结果为真就用1表示,若为假,就用0表示。但并不是为真就只能用1表示。
假设我们的判断条件有很多,我们可以这样写:
int main() { int age = 0; scanf("%d", &age); if (age < 18) printf("青少年\n"); else if (age >= 18 && age <= 30) printf("青年\n"); else if (age >= 31 && age <= 50) printf("中年\n"); else if (age >= 51 && age <= 80) printf("中老年\n"); else if (age >= 81 && age <= 100) prnitf("老年\n"); else printf("老寿星\n"); return 0; }
小测试:下面这段代码的执行结果是什么呢?
int main() { int a = 0; int b = 2; if(a == 1) if(b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
答案是:什么都不打印。
也许会小伙伴的答案是打印haha,这里解释一下:else会与其距离最近的if语句结合,构成if else语句。所以当判断a==1时,并不成立,所以整个if else语句都不会执行。当然也就什么都不打印了。
1.3.2 switch语句
switch语句也是一种分支语句。 常常用于多分支的情况。
语法格式:
switch(整形表达式) 注意:这里必须是整形表达式,不能是浮点型。
{
语句项;
}
这里所谓的语句项,指的是case语句,例如:
case 整形常量表达式: 注意:这里也必须是整形常量表达式。不能是被const修饰的变量,也不可以是浮点型。
语句;
假如我们要实现一个功能:输入1,打印周一,输入2,打印周二……我们就可以选择switch语句。
int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: printf("周一"); case 2: printf("周二"); case 3: printf("周三"); case 4: printf("周四"); case 5: printf("周五"); case 6: printf("周六"); case 7: printf("周日"); } return 0; }
但是当我们运行时,却发现:我们输入1,我们只需要程序打印周一,但是程序却将周一到周日全打印了。这是因为我们输入day的值之后,会与case之后的值由上到下进行匹配,在这个匹配过程中,并不会执行case之后的代码块。若匹配成功,就执行该case后的代码,直到遇到break才退出switch语句。
所以,我们可以这样改进:在每个case语句的代码的最后都加上break语句。
int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: printf("周一"); break; case 2: printf("周二"); break; case 3: printf("周三"); break; case 4: printf("周四"); break; case 5: printf("周五"); break; case 6: printf("周六"); break; case 7: printf("周日"); break; } return 0; }
此时程序就可以执行我们想要的功能了。
那假如我们的需求变成了:
输入1-5 ,输出工作日
输入6-7,输出休息日
int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; } return 0; }
1.3.3 default 子句
当switch中的整形表达式的值与case的整形常量表达式的值都匹配不上时,我们就可以添加一个default子句,这时就会执行default语句。例如:
int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; default: printf("输入有误,请重新输入!"); break; } return 0; }
注意:
- 一个switch语句只能有一个default子句
- default子句可以出现在switch语句的任何位置
- 在default语句之后也最好再加上一个break,养成好习惯