本文已收录至《C语言》专栏
欢迎多多浏览,点赞,收藏️+关注
目录
前言
正文
⚙️while循环
while语句格式:
特殊的:do-while循环
⚙️for循环
for语句格式:
对比for循环与while循环
for语句的循环控制变量
一些特殊的for循环写法
⚙️循环搭档:break和continue
⚒️break关键字
️continue关键字
⚙️goto语句
goto语句格式:
相关综合小例题——二分查找
总结
在进入循环的介绍前,我想“流水线”大家应该都不陌生,世界上很多工厂都有流水线的生产,这样的效率非常高。在一条生产线上工人们重复着做一个工序,这就是流水线。
随着科技的进步,流水线生产逐渐被机器替代,因为做一件重复的事是机器最擅长的,那么本次文章通过向大家介绍循环来揭开机器的循环工作帮助人们高效办公的神秘面纱!
循环的字面意思就是重复的做某一件事
如果把我们人比作判断if,那么机器比作while循环就再合适不过了。
>>接下来我们开始介绍循环的魅力<<
⚙️while循环
while语句格式:
while(条件) {语句块} while循环中的条件与if中的“条件表达式”类似,当条件为真时一直执行该while所管辖的语句块,一直到括号中的条件为假才停止,所有while语句所管辖的语句块中一般有限制条件(逐渐让条件表达式向假逼近)的执行语句!一般while在使用中,我们经常将变量作为条件表达式,当变量大于0时为真,等于0时为假;相同的,也可以定义布尔类型(bool)值判断,true为真,false为假。
示例一:利用while循环实现1-10数字的输出
//输出1-10之间的数 #inlucde
int main() { int i = 1;//记录循环次数 while (i <= 10) { printf("%d ", i);//输出当前i的值 i=i+1;//作为限制条件和加数 } return 0; }
> 示 例 一 分 析 <
可以看出,这里“i”作为限制条件不断累加,每次累加后进入循环再输出“i”的值,当“i”大于10时停止循环,最终控制台上也输出了1-10这十个数字,其实此时“i”已经等于11所以控制条件i<=10与i<11等价。
示例二:利用while循环实现1-100数字的累加
//计算1-100的累加 #include
int main() { int i = 0;//记录循环次数 int sum = 0;//累加 while (i <= 100) { sum += i;//累加i i++;//作为限制条件和加数 } printf("sum= %d\n",sum);//输出sum return 0; }
> 示 例 二 分 析 <
可以看出,通过while循环我们实现了1-100的累加计算;其中,“i++”是限制条件(我们前面提到过,i++就是后置自加,先传递自加的参数然后自加1)。我们要求“i”要小于等于100,那么循环停止的条件就是“i”大于100,我们对“i”不断进行累加,通过s+=i(也就是s=s+i)将每次累加的“i”都累加到sum,这样i=1,sum=1;i=2,sum=1+2......,最终直到“i”大于100,循环停止,而sum所累加的结果就是1-100的总和,也就是5050。
特殊的:do-while循环
语句格式:
do {语句块} while(条件); 我们都知道,“do”的意思是“做”,那么do-while循环的意思则是:在循环第一次执行时无论条件是否成立,都执行一次语句块,然后再判断循环条件是否成立。这样我们就得出结论:do-while循环无论条件是否成立,该循环至少执行一次!
示例:利用do-while输出1-10之间的数
//do-while输出1-10之间的数 #include
int main() { int i = 0; do { ++i; printf("%d ",i); } while (i<10&&i>0); return 0; }
> 示 例 分 析 <
可以发现,我们的“i”初始化为0,我们的循环条件是i大于0且i小于10(从0到9循环了10次),如果是while循环,在此条件下是一次都不执行,但do-while循环则先执行了一次,让“i”自加到1,到第二次循环判断时i大于0的条件就成立 ,则进入下一次循环,直到i小于10条件不成立时结束。
do-while的使用场景有限,所以不是经常使用!
do-while循环常与switch连用,使主函数不会执行一次就退出,而是一直执行,通过switch分别调用其他函数,使程序有逻辑的连贯运行。
⚙️for循环
for语句格式:
for(表达式1(初始化);表达式2(条件);表达式3(条件递进)) {语句块} for循环与之前的while循环就大不相同,相对于while来说,for循环类似于一个条理清晰的循环。
这里要说的是,在for循环的执行中,表达式1只会被执行一次,表达式2是每次进入语句块时都会首先判断的 ,如果为假则跳出循环,而表达式3则是每次执行完语句块后再执行,所以表达式3是整个for循环,循环一次最后执行一个语句。
示例一:利用for循环实现1-10数字的输出
//for循环输出1-10之间的数字 #inlcude
int main() { int i = 0; for(i=1;i<=10;i++) { printf("%d ", i);//输出当前i的值 } return 0; }
> 示 例 一 分 析 <
可以看出,对于while循环,我们从for循环的三个表达式中就能知道循环执行的所有条件,我们定义“i”时将“i”初始化为0,进入for循环后首先判断表达式2是否为假,否则进入循环语句块输出“i”,然后跳出执行i++,直到i大于10则停止循环,这里基于上面我们讲到的for循环最后才执行表达式3,所以“i”在跳出循环时的值为11。
示例二:利用for循环实现1-100数字的累加
//利用for计算1-100的累加 #include
int main() { int i = 0; int sum = 0; for(i=1;i<=100;i++) { sum += i;//累加i } printf("sum= %d\n",sum);//输出sum return 0; }
> 示 例 二 分 析 <
可以看出,同样的从利用循环从1-100,for循环可以使与循环相关的条件都不出现在语句块中,这样可以使我们要修改某个数据时,例如求1-100中的所有偶数时不需要跑到语句块中去修改限制条件,我们只需要将“i”初始化为0,i++修改为i=i+2即可。
对比for循环与while循环
//输出1-10之间的数 #include
int main() { int i = 0; //实现相同的功能,使用while { i = 1;//初始化部分 while (i <= 10)//判断部分 { printf("%d ", i); i++;//调整部分 } } printf("\n"); //实现相同的功能,使用for { for (i = 1; i <= 10; i++) { printf("%d ",i); } } }
> 结 论 <
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
for语句的循环控制变量
int i = 0; //前闭后开的写法 for(i=0; i<10; i++) {} //两边都是闭区间 for(i=0; i<=9; i++) {}
> 小 提 示 <
不可在for 循环体内修改循环变量,防止 for 循环失去控制。
建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
一些特殊的for循环写法
//无参无条件(无表达式) for(;;) {}//初次学习不建议这样写,容易造成死循环 //(表达式1省略)初始化在外for int i=0; for(;i<10;i++) {} //for的多变量控制循环 for(int k=0,i=0;i<10&&k<10;i++,k++) {} //多重for循环(嵌套) for(int i=0;i<10;i++) { for(int k=0;k<10;k++) { for(;;) {}//等.... } }//这样的嵌套常用于多维数组,我们后期会介绍 //这里的i和k在跳出对应循环时会失效,作用范围仅在循环的语句块范围类
写一个类似于while风格的for循环
#include
int main() { int i = 0; for (; i < 10;) { i++; printf("%d ",i); } }
⚙️循环搭档:break和continue
在使用for,while和do-while循环时,我们不是一直去执行循环,有时候会借助if或者其他判断语句跳出循环或者停止当前循环,下面我们来介绍常用循环搭配的break和continue。
⚒️break关键字
break单词有中断的意思,而在循环中,执行break也如词义所示,就是终止循环。
示例:输出1-5之间数
//输出1-5之间的数 int main() { int i = 1; printf("while:"); while (i < 10) { if (i > 5) { break; } printf("%d ",i); i++; } printf("\n for:"); for (i = 1; i < 10; i++) { if (i > 5) { break; } printf("%d ", i); } return 0; }
> 结 论 <
对于while和for循环,在使用break时大同小异;不过细微的差别是,当while使用break时,限制条件放在break前和限制限制条件放在break后面有一点差别,具体需要依照使用情况而定。
而对于do-while循环,如果第一次执行语句就执行了break则直接跳过循环,相当于语句只执行了一次。
️continue关键字
continue是用于终止“本次”循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到循环的判断部分。进行下一次循环的入口判断。
示例:输出1-10的偶数
//输出1-10之间的偶数 int main() { int i = 1; printf("while:"); while (i < 10) { i++; if (i % 2 != 0) { continue; } printf("%d ",i); } printf("\nf o r:"); for (i = 1; i <= 10; i++) { if (i % 2 != 0) { continue; } printf("%d ", i); } }
> 小 提 示 <
如果大家细心的话,会发现这次的while循环中,我将限制条件“i++”放在了continue前面,我们可以思考一下,如果放在continue后面会怎样?那么每一次当循环次数为奇数次时,每次都会跳出循环且不执行“i++”此时while陷入死循环,但是for则不会,因为for循环的限制条件在for的表达式中,无论如何也不会被跳过,所以在continue上,for和while的区别还是比较大的,特别是while要注意限制条件的执行位置,否则就会进入死循环。
而对于do-while,也是类似的,要注意限制条件的执行位置。
⚙️goto语句
goto语句格式:
标记:
goto 标记;
goto语句是一个随来随去的语句,我们在程序代码的某一行设置一个标记,“goto 标记”就能立刻去到标记处的程序段。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,什么是深度嵌套?就是嵌套了多个for或者if后逻辑非常复杂,有时候可能会引发错误导致程序出错,此时我们需要goto语句来将程序的执行跳到其他程序块处理错误。对于我们初阶来说,goto语句我们是建议不用的,因为滥用goto会导致程序逻辑混乱!
示例:利用goto嵌套if实现循环打印1-10之间的数
//利用goto嵌套if实现循环打印1-10之间的数 int main() { int i = 0; go://标记 if (i < 10) { i++; printf("%d ",i); goto go;//返回到go标记的语句开始执行 } return 0; }
> 示 例 分 析 <
可以看出,这里的逻辑是当i小于10时执行if所管理的语句块,而if语句块的最后一句是goto到go标记的位置,所以只要if条件成立则会一直循环执行,直到“i”自加到大于10才会停止。
相关综合小例题——二分查找
//二分查找 int sumr(int* arr, int r, int z) { int L = 0;//左边下标 int R = r - 1;//右边下标 while (L < R) { int sr = (R + L) / 2;//求中间下标 if (z > arr[sr]) { L = sr + 1;//改变左边下标的界限 } else if (z < arr[sr]) { R = sr - 1;//改变右边下标的界限 } else if (z == arr[sr]) { return sr;//找到了返回下标 } } return 0; } int main() { int sum = 0; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = (sizeof(arr)) / (sizeof(arr[0]));//求数组长度,传参 printf("请输入查找的数>"); scanf("%d",&sum); int s = sumr(arr, sz, sum); if (s == 0) { printf("没找到!\n"); } else { printf("%d找到了,下标为%d\n", sum, s); } }
> 逻 辑 分 析 <
二分查找的主要逻辑是,求这个数组的长度,然后将查找的数组,数组长度以及查找的值传递给二分查找的函数,二分查找函数中先确定左右下标,也就是left和right,随后进行循环查找,查找逻辑是不断缩小查找范围,例如题目中的1-10十个数,求数组长度是10,那么左下标的起始是[0],右下标的起始是[9](下标范围0-9),求下标的一半则是4,下标[4]对应的值是5,如果查找值比5还大,则左下标left等于下标[4+1],否则右下标等于[4-1]。
这里不难看出,二分查找是有条件的,条件是数据必须是连续且是顺序的,否则无法进行查找,这适用于对排序后的数据进行查找,再大的数据,查找次数也不会超过百次,这大大减少了循环所占用的性能资源优化了程序的时间复杂度。
本次我们介绍了循环语句,循环语句的构成可以使用for,while和do-while来实现且可以借助break和continue加上嵌套if使得我们的循环更高效,合理的使用循环可以大大减少代码中重复出现的执行语句,帮助人们节省人力,使我们的工作更高效!
本次循环语句的介绍就到这里了,喜欢的读者可以多多点赞收藏关注。
如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!
学习的路途遥远无尽,我将砥砺前行!