前言
在C语言中,语句可分为5类:表达式语句、函数调用语句、控制语句、复合语句、空语句。本篇将详细介绍控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(顺序结构、循环结构、选择结构),它们由特定的语句定义符组成。
C语言有9种控制语句,可分为以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句
- 循环执行语句:do while语句、while语句、for语句
- 转向语句:break语句、goto语句、continue语句、return语句
1.分支语句(选择结构)
大学好好学习,校招拿到好offer,走上人生巅峰,迎娶白富美;不好好学习,毕业回家卖红薯;或其他。
这就是选择。
1.1 if语句
在C语言中,if语句即可以实现单分支,又可以实现多分支。那语法结构是怎么样呢?
//语法结构 //单分支 if(表达式) 语句; //多分支 if(表达式) 语句1; else 语句2; //更多分支 if(表达式1) 语句1; else if(表达式) 语句2; else 语句3;
Tips:
- 在C语言中,如果表达式结果为真,则语句执行。而C语言规定0表示假,非0表示真。
- 如果上述表达式成立,要执行多条语句,要将代码块放在{ }中。
- 当出现悬空else时,else和离它最近的if匹配,而非和它对其的else匹配。
- 在判断常量表达式时(例如判断5和sum是否相等),建议读者写成5==sum(这样写可以防止读者在实际写代码的过程中,少写一个=,把判断语句写成赋值语句)
1.2 switch语句
switch语句也是一种分支语句,常常用于多分支的情况。
比如如果出现以下情况:
输入4-7,相应的输出星期四到星期七。
如果我们写成if…else if…else if…这种形式,无疑太过复杂。而C语言给出了一种好的解决方法——switch语句。
//switch语句 switch(整形表达式) { 语句项; //语句项是一些case语句 } //如下: //case 整型表达式: // 语句;
1.2.1 在switch语句中的break
在switch语句中,我们没办法直接实现分支,搭配break后才能实现真正的分支。
例如:我们要求输入4和5,输出weekday;输入6和7,就输出weekend
我们的代码可以这样实现:
#include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 4: case 5: printf("weekday\n"); break; case 6: case 7: printf("weekend\n"); break; } return 0; }
- break的实际效果是将语句列表分为不同的分支部分。
- switch()中只能是常量表达式。
- 编程好习惯:在最后一个case语句后加一条break语句。(这样写可以避免在以后自己或他人要修改该代码时,在以前的最后一个case语句后面忘记添加break语句)
1.2.2 default语句
在实际过程中,如果表达式的值与所有的case标签的值都不匹配要怎么办呢?
其实也没什么,结构就是跳过所有语句罢了。但有意思的是, 程序并不会停止也不会报错(这种情况下,C不认为是个错误)。
如果不想忽略不匹配的所有标签,我们可以在语句列表中添加一条default语句。
- 当switch表达式的值并不匹配所有case标签的值时,default后面的语句就会执行。
- 每一个switch语句只能出现一条default语句
- default语句可以出现在语句列表中的任何位置,执行时会像执行case标签一样执行default语句
- 编程好习惯:在每一个switch语句中加一个default语句,甚至可以在后面再加一个break语句。
2. 循环语句
- while
- for
- do while
下面我们来看一个简单的循环
2.1 while循环
在生活中很多情况是:同一件事需要完成多次,而if语句只能执行一次,那要怎么办呢?
C语言引入了while语句,可以实现循环。
while 语法结构:
while (表达式) 循环语句;
while语句的执行流程图:
Instance:如何在屏幕上打印1-10的数字。
我们可以这样实现:
#include <stdio.h> int main() { int i = 1; while (i <= 10) { printf("%d ", i); i = i + 1; } return 0; }
2.1.1 while语句中的break
break介绍
//break 代码实例 #include <stdio.h> int main() { int i = 0; while (i <= 10) { if (i == 5) break; printf("%d ", i); i = i + 1; } return 0; }
这些代码输出结果是什么呢?
总结:
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环,所以while中的break是用于永久终止循环的。
2.1.2 while语句中的continue
continue介绍
//continue 代码实例 #include <stdio.h> int main() { int i = 0; while (i < 10) { i = i + 1; if (i == 5) continue; printf("%d ", i); } return 0; }
这段代码只是把break改成continue,代码输出结果是什么呢?
运行代码后我们发现除5之外,其他数字都正常输出。
总结:
continue在while中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while的判断部分,进行下一次循环的入口判断。
2.2 for循环
首先我们来看for循环的语法:
2.2.1 语法
for(表达式1:表达式2:表达式3) 循环语句; //表达式1为初始化部分,用于初始化循环变量的。 //表达式2为条件判断部分,用于判断循环什么时候终止 //表达式3为调整部分,用于循环部分的调整
for循环的执行流程图:
Tips:
- 对比for循环和while循环,我们可以发现while循环中依然存在循环的三个必要条件,但由于风格的问题使得while循环的3个部分可能偏离较远,导致查找修改不够集中和方便。所以for循环的风格更甚一筹,使用频率也跟高。
- 在for循环中,break和continue得意义和while循环是一样的。
- 建议1:不可在for循环体内修改循环变量,防止for循环失去控制。
- 建议2:for循环控制变量的取值采用“前闭后开区间”写法。
2.2.2 一些for循环变种
我们来看以下4段代码,看看结果如何,打印多少个hehe。
#include <stdio.h> int main() { //代码1 for (;;) { printf("hehe\n"); } //代码1运行,会死循环打印hehe //代码2 int i = 0; int j = 0; for (; i < 10; i++) { for (; j < i; j++) { printf("hehe\n"); //j初始化省略,j在第一次循环结束后会,不会从0开始,而是保持原来的值 } } //代码2运行,打印10个hehe //代码3——使用多哥变量控制循环 int x, y; for (x = 0, y = 0; x < 2 && y < 5; x++, y++) { printf("hehe\n"); } //代码3运行,打印2个hehe return 0; }
- for循环中,初始化和调整部分的省略就是什么都不做。
- for循环中,判断部分的省略意味着判断恒为真。
2.3 do…while()循环
2.3.1 do语句的语法
do 循环语句; while(表达式);
2.3.2 执行流程
2.3.3 do语句的特点
do语句循环时,至少执行一次,但场景有限,所以不经常使用。
#include <stdio.h> int main () { int i = 1; do { printf("%d ", i); //不管如何,先执行代码块中内容,在判断是否在执行 i++; } while (i <= 10); return 0; }
- do while语句中的break和continue的意义和while语句以及for语句效果是一样的。
3.goto语句
C语言提供了可以随意滥用的goto语句和标记跳转的标号。理论上goto语句是没有必要的,实践中没有goto语句也可以很容易写出代码。但在某些场合下,goto语句还是可以用的着的,最常见的用法就是终止程序在某些深度嵌套的结构处理过程中。
例如:一次跳出两层或多层循环。(多层循环这种情况下使用break是达不到目的的,它只能从内层循环退出到上一层循环)
goto语句真正适合的场景如下:
for (...) { for (...) { ... for (...) { if (disaster) goto error; } } } error: if(disaster) //处理错误情况
结尾
本篇文章到这就结束了,希望能帮读者更好的了解控制结构的全貌,建立一个完整逻辑框架。创作不易,如果觉得本篇文章对你有帮助,记得点赞加关注哦。感谢你的支持!