参考:https://blog.csdn.net/weixin_44617968/article/details/117656810
流程控制
控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。不论是在声明式编程语言或是函数编程语言中,都有类似的概念。
从逻辑上,语言是为了模拟实现我们现实生活中的每件事情,通过证明只需要具有 顺序,条件分支,循环 三种流程就可以模拟我们的任何事情。
对于C语言来说,系统会按顺序执行程序中的每一行代码。但仅有顺序执行是不够的,通现实一样,C语言还需要条件分支(选择结果),循环结构。
顺序结构:
按书写顺序从上至下依次执行
#include <stdio.h> int main() { /* 这是一个计算器的案例,version0.1 输入你的数字,返回数字之和。 */ // 定义两个变量,用来接收输入的数字 int numOne; int numTwo; int numOpera; int opera; // 友好提示信息 printf("这是一个计算机的案例\n"); printf("输入的格式为 3 5 1,返回值3+5的和为8\n"); printf("输入的格式为 3 5 0,返回值3-5的差为-2\n");
选择结构
if选择结构
if(表达式){ 语句1; }else if(表达式2){ 语句2; }else{ 表达式3; } 后续语句;
案例:
#include <stdio.h> int main(){ int a; printf("请输入数字,我们判断大小"); scanf("%d",&a); // if(a == 10){// 错误写法, 但不会报错 if (10 > a){ printf("a的值小于10\n"); }else if(10 == a){ printf("a的值等于10\n"); }else{ printf("a的值大于10\n"); } }
基于函数封装的条件选择
#include <stdio.h> int main() { aCompare10(); } aCompare10(int a) { int a; printf("请输入数字,我们判断大小"); scanf("%d",&a); if (10 > a) { printf("a的值小于10\n"); } else if(10 == a) { printf("a的值等于10\n"); } else { printf("a的值大于10\n"); } }
switch选择
switch(表达式){ case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; case 常量表达式n: 语句n; break; default: 语句n+1; break; }
案例
#include <stdio.h> int main() { aSwitch10(); } aSwitch10() { int a; printf("请输入功能选项,8表示XX,10表示YY,其它为ZZ\n"); scanf("%d",&a); switch(a) { case 8: printf("当前选择了8,值为:%d",a); break; case 10: printf("当前选择了10,值为:%d",a); break; default: printf("当前为默认值"); } }
注意
switch 的表达式及 case 的值 的类型必须是 int ,或者可以被提升为整型的值(char,short)
case 的值不能相同
每个 case 要以 break 结尾,否则会出现穿透问题
default 不一定要放在 case 最后,只有等到所有 case 不匹配才会执行。
循环结构
循环条件 成立时,会反复执行 循环体 ,直到条件不成立位置
while循环
while(循环控制条件) { 循环体中的语句; 能够让循环结束的语句; .... }
循环控制条件:循环退出的主要依据,来控制循环到底什么时候退出
循环体:循环的过程中重复执行的代码段
循环终止语句(递增、递减、真、假等):能够让循环条件为假的依据,否则退出循环
案例
#include <stdio.h> int main() { // while循环 whileTest(); } whileTest() { /* 当输入的值为0-18的时候,输出 他还是一个孩子啊 当输入的值为>50的时候,输出 他只是一位老人啊 while(循环控制条件) { 循环体中的语句; 能够让循环结束的语句; .... } */ while(1) { int a; printf("请输入他的年龄\n"); scanf("%d",&a); if(a<=18 && a>0 ) { printf("他还是一个孩子啊\n",a); } else if(a>50) { printf("他只是一位老人啊\n",a); } else { printf("年轻人就得多努力\n",a); } } }
输出为:
案例,带有退出机制
#include <stdio.h> int main() { int num = 5; // while循环 whileTest(num); } whileTest(int b) { /* 当输入的值为0-18的时候,输出 他还是一个孩子啊 当输入的值为>50的时候,输出 他只是一位老人啊 while(循环控制条件) { 循环体中的语句; 能够让循环结束的语句; .... } */ while(b) { --b; printf("当前的b的值为:%d",b); int a; printf("请输入他的年龄\n"); scanf("%d",&a); if(a<=18 && a>0 ) { printf("他还是一个孩子啊\n",a); } else if(a>50) { printf("他只是一位老人啊\n",a); } else { printf("年轻人就得多努力\n",a); } } }
输出为:
do while
do { 循环体中的语句; 能够让循环结束的语句; .... } while(循环控制条件);
a. 应用场景 do while 与 while
#include <stdio.h> int main() { int num = 0; // 当num为0时 // do while循环 至少允许一次 //doWhileTest(num); // while可能一次也不运行 doWhileTestVSWhile(num); } doWhileTest(int b) { /* 当输入的值为0-18的时候,输出 他还是一个孩子啊 当输入的值为>50的时候,输出 他只是一位老人啊 do { 循环体中的语句; 能够让循环结束的语句; .... } while(循环控制条件); */ do { printf("当前的b的值为:%d",b); printf("请输入他的年龄\n"); int a; scanf("%d",&a); if(a < 18 && a >0) { printf("他还是一个孩子啊\n",a); } else if(a > 50 ) { printf("他是一位老人啊\n",a); } else { printf("年轻人就得多努力\n",a); } } while(b); } doWhileTestVSWhile(int b) { /* 当输入的值为0-18的时候,输出 他还是一个孩子啊 当输入的值为>50的时候,输出 他只是一位老人啊 do { 循环体中的语句; 能够让循环结束的语句; .... } while(循环控制条件); */ while(b) { printf("当前的b的值为:%d",b); printf("请输入他的年龄\n"); int a; scanf("%d",&a); if(a < 18 && a >0) { printf("他还是一个孩子啊\n",a); } else if(a > 50 ) { printf("他是一位老人啊\n",a); } else { printf("年轻人就得多努力\n",a); } } }
do…while 和 while 的区别
do…while 至少执行一次
while 可能一次都不执行
for循环
for(初始化表达式;循环条件表达式;循环后的操作表达式) { 循环体中的语句; }
对比 while 来说, for 更节约内存空间
案例
#include <stdio.h> int main() { int num = 5; forTest(5); } forTest(int b) { /* for(初始化表达式;循环条件表达式;循环后的操作表达式) { 循环体中的语句; } */ for(int startNum = 0; startNum<b; startNum++) { printf("当前的startNum的值为:%d",startNum); printf("请输入他的年龄\n"); int age; scanf("%d",&age); if(age < 18 && age >0) { printf("他还是一个孩子啊\n",age); } else if(age > 50 ) { printf("他是一位老人啊\n",age); } else { printf("年轻人就得多努力\n",age); } } }
输出为:
案例输出九九乘法表;
#include <stdio.h> int main() { forTest(); } forTest() { /* 99 乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 ... for(初始化表达式;循环条件表达式;循环后的操作表达式) { 循环体中的语句; } */ // 遍历1-9 每遍历一次 输出一行 for(int a = 1 ; a <=9; a++) { //printf("当前a的值为%d \n",a); for(int b =1; b<=a; b++) { //printf("当前a的值为%d ,b的值为%d ",a,b); printf("%d*%d=%d \t",b,a,a*b); } printf("\n"); } }
输出为:
循环优化
在多重循环中,应当将最长的循环放在最内层,最短的循环放在最外层,减少CPU跨循环层切换的次数
举个栗子🌰:
有500道菜,都需要品尝一遍,两种方案,一种方案是:是一个桌子上100道菜,一共5个桌子。另外一种方案是一个桌子上5道菜,一共100个桌子。哪种方案品尝的快一些。
for (row=0; row<100; row++) { // 低效率:长循环在最外层 for ( col=0; col<5; col++ ) { sum = sum + a[row][col]; } } for (col=0; col<5; col++ ) { // 高效率:长循环在最内层 for (row=0; row<100; row++) { sum = sum + a[row][col]; } }
四大跳转
C语言中提供了四大跳转语句, 分别是return、break、continue、goto
break:
备注:无限循环电影中的那个契机,如果不热爱生活,或balabala,那么就永远在循环中,要想跳出循环,就需要一个条件,然后打破当前循环
类似与打王者荣耀,退出五人局
立即跳出switch语句或循环,一个 break 只向外跳一层,同一层, break 后面的语句不会执行
如果switch没有break
#include <stdio.h> int main() { aSwitch10(); } aSwitch10() { int a; printf("请输入功能选项,8表示XX,10表示YY,其它为ZZ\n"); scanf("%d",&a); switch(a) { case 8: printf("当前选择了8,值为:%d \n",a); // break; case 10: printf("当前选择了10,值为:%d \n",a); // break; default: printf("当前为默认值\n"); } }
输出为:
案例
#include <stdio.h> int main() { breakTest(); } breakTest() { for(int a = 0;a<5;a++){ printf("当前a的值为%d\n",a); if(a==3){ break; } } }
输出为
continue
结束 本轮 ,进入 下一轮 循环
类似打王者荣耀退出当前局进行下一局
案例
#include <stdio.h> int main() { continueTest(); } continueTest() { for(int a = 0;a<20;a++){ if(a %2 ==0){ continue; } printf("当前a的值为%d\n",a); } }
输出为:
goto
仅在本函数内实现跳转,不能实现跨函数跳转,goto 会破坏结构化程序设计流程,它将使程序层次不清,且不易读,所以慎用
#include <stdio.h> int main() { goToTestOne(); goToTestTwo(); } goToTestOne() { int num = 0; // loop:是定义的标记 loop: if(num < 10) { printf("num = %d\n", num); num++; // goto loop代表跳转到标记的位置 goto loop; } } goToTestTwo() { while (1) { while(1) { goto out; printf("dfdf\n"); } } out: printf("跳过了所有循环"); }
输出为:
return
结束当前函数,将结果返回给调用者
类似打王者荣耀退出当前游戏
案例
基于for循环输出圣诞树,参考https://blog.csdn.net/qq_58417838/article/details/127562174
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { system("color 4");//设置控制台的字体颜色 int i, j, k,m; //由以上两个四层字符代码可以引入第四个变量m,进行多次循环嵌套,代码如下 for (m = 0; m < 7; m++){ for (i = 0; i < 4; i++)//四行为一组 { for (j = 0; j < 40 -(m+1)* i-m; j++)//相当于在控制台的第i行输出40-i个空格 printf(" "); for (k = 0; k < (2+2*m) * i + 1+2*m; k++)//开始打印字符,每次比上一次多加了两个字符,对应的空格也在减少 printf("^"); printf("\n");//每一行输出完了换行 } } for (i = 0; i < 6; i++)//和上面的每四行字符代码一样,树根设置为六行 { for (j = 0; j < 38; j++)//设置38个空格 printf(" "); printf("|||||");//打印树根 printf("\n");//换行 } printf("希望你天天开心,万事如意!!!\n"); return 0; }
输出为: