目录
文前声明:
我们还有个流程控制的小尾巴没有讲完,我们在上节讲了流程控制的分支语句和转向语句,然而,流程控制中同样重要的循环语句却被我们当作一个小尾巴留下了。虽然我们与循环语句奔现的时间长了一些,但却不影响我们的理解,不乏主角分开出场的电视剧,他们都是c语言中不可或缺的一部分。
那么,接下来我们将开始步入循环语句的学习:
循环语句
人生会日复一日的进行,我们的生活在不停的更迭,循环语句所蕴含的意义在我们的生活中也有体现。在我们希望连续不间断的打出一些字符的时候,我们都会想到利用printf进行一串“亲手而作”的输出。
比如我们希望输入数学问题中常见的5的阶乘:"5!”,我们会利用如下代码
int num;
num=5*4*3*2*1;
printf(“%d",num);
这并不会难倒我们,但是你有没有想过,如果我们进行的不仅仅是五的阶乘,而是10,20,甚至是200呢?这个时候还需要我们一个一个打出来?答案一定是否定的。
我们无时无刻都要记住,计算机本身就是一个节省算数时间,提高计算效率的机器,过于复杂的操作我们的前人早已为我们研究出了简单的程序。那么这就开始需要用到我们的第一个循环语句了。
while语句
对于while语句,我们有着最基本的使用格式:
while(循环条件){
//循环体
}
在循环语句中,循环体构成了主要的部分,循环条件起着“守门”的职责,对循环体的执行把关。
在while语句的执行原理是这样的:在执行判断条件后,我们会进入循环体持续执行内部的语句,直到不满足循环条件为止,流程图如下:
while语句的作用效果还是较为直观的,为了避免无休止的重复计算,我们通常会以变量作为循环条件,以实现及时的制止循环体的循环。我们的判断条件同样也可以是(1)中所提及到的逻辑判断,在不为0的情况下会对循环体执行一次后继续判断条件是否成立。
while语句还有个孪生兄弟
do-while语句
do-while语句的基本架构和while语句较为相似,却又有不同
do{
//循环体
}while(循环条件);
它与while语句最大的不同在于do-while语句在判断条件前,会执行一次循环体当中的指令,再判断循环:进入循环时不做检查,执行一轮循环体代码后,再检查条件是否满足。这是它与while条件最大的不同之处。
具体流程图如下:
特别注意很多新人容易犯的错误:我们的循环条件括号后是需要带有“;”的,这是不可以被省略的,不然我们的编译器会对我们进行一条error的错误提醒。
在部分用法上,do-while语句和while语句是相通的,所以我们不需要过度解释。灯光交给下一种循环语句,我们的循环语句还有尤为重要的一员。
for语句
对于for语句,他对于后续的内容例如数组等都起着不可或缺的作用,当然我们一会将会说到三种循环语句的共通性,但我们通常的习惯会导致我们会偏爱于for语句多一点。
for语句的基本架构如下:
for (语句1;语句2;语句3){
//循环体
}
其实,看着并不复杂,只是有着固定的顺序而已。
for语句的作用效果是:在进入for语句后,语句1通常是一种需要实现的预处理;语句2作为继续条件,实现对for语句是否执行循环体的判断;语句3是作为对循环体的收尾处理或是一种对下一个循环进行的准备工作。所以我们的执行顺序是这样的:
步入for循环后,先进行语句1中的预处理,再进行语句2的判断,若判断条件为true,则进行一次循环体,执行循环体后步入语句3,执行语句3的指令,再重新回到语句2判断循环条件是否为true......
对于语句1:在预处理中我们一般会在这里引入一种变量并对它进行赋值,后利用这个变量实现对for循环的有效利用。
对于语句2:我们会利用引入的变量或其他表达式来对循环体做一个及时的制止,避免多次循环或无效循环。
对于语句3:在执行循环体后绝大多数情况都是需要为了预准备,为了下一次循环体对语句2的判断作出合理的对接。
具体流程图是这样的:
当然,在未来那些浩如烟海的程序中,我们难免会见到一些奇怪的写法:
1.省略语句1:意为我们不用在对for循环的起始赋予初始值,直接判断条件是否为真。
2.省略语句2:这标志着我们步入for循环后不会进行条件判断,直接执行循环体中的指令。这种写法很少看到,因为他斌没有严格的意义,甚至不一定可以退出循环体。
3.省略语句3:这样的写法意味着我们不需要在对程序进行善后处理,在执行循环体后直接进行条件判断。
循环语句的深层用法
到了这个时候,不知你是否有了一定的启迪与发现?没错,它们虽然都有着自己的独特之处,但是这些循环语句都有着相通的作用。
几种循环的比较
3种循环的共同之处在于可以处理同一问题,一般情况下它们可以互相代替,如以上for循环的三条不同作用的语句,也可以同样用另外两种循环语句的架构作出完全相同的效果。
首先用while语句的架构:
语句1; //初始化操作
while(语句2){
...
语句3
...
}
在用do-while语句的架构:
语句1; //初始化操作
do
{ . . .
语句3
...
}while(语句2);
我们可以看到,它们可以使用不同的架构实现相同的作用效果,这是十分神奇的。需要注意的是,用while和do-while循环语句的时候,循环变量初始化应在循环语句关键词前完成,而for语句可以在括号中语句1的位置实现循环变量的初始化。
所以,虽然循环语句的组成语句都可以实现相近的作用,但总有优劣的使用次序:如果有固定次数用for;如果必须执行一次用do-while;其他情况用while。这是一条虽不严谨却很实用的小技巧。
除此之外,我们还在上篇博客中讲到过关于分支语句中if语句的级联结构,if语句的级联其实就是一种嵌套,编程语言中的嵌套结构就是层层勾连,所以又叫级联结构,在if语句中多次包含if语句,就形成了一种嵌套结构。
循环的嵌套
人类的自我创造能力是十分强大的,堆积能力便是其中之一,这种嵌套就是一种侧面的体现,这种嵌套何尝不是一种堆积。在不断的if堆积中形成了一种分支的结构,我们的循环语句也可以这样,在一种循环语句的使用基础上,我们可以不断向中堆砌。在c语言深入学习的过程中,我们会经常看到这个说法的影子,在不远的将来,我们会学习指针,数组,函数,结构体,它们或多或少都会有这样的体现。
回到正题。
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。
三种循环语句可以自己在自己的结构里构造嵌套循环,如:
while(){
...
while(){
...}
...
}
当然,也可以构造一种循环中的另一种循环:
while()
{...
do{
...
}while();
...
}
对于循环语句的嵌套和多重循环,我们就介绍这么铎,因为它可以创造无限的可能,它不可能是被三言两语的阐述尽的。请坚信,在将来,可能许多传奇的程序都会缔造在我们的手中...这个世界本就充满着无限的可能。
转向语句的使用
上节我们所讲到的转向语句,其实更多的是用在循环语句中阻断循环程序的进行,我们的break和continue是为了让循环语句和分支语句更好的善始善终,所以上节所讲到的转向语句的所有语法依然可以用在循环体中,它们所执行的作用如下图所示:
当然,这张流程图中缺少了goto语句的使用,在之前我们也曾提过,goto语句是充满破坏性的,它并不与其他的转向语句相通,它破坏了一种程序循序渐进的结构和顺序,所以不被人们所提倡,但它的作用无与伦比,不过为了避免初学者的混淆,我们不在流程图中标出goto语句对程序的影响。实际上并不是不想标,而是不能标,它的影响是无法估量的。
抛去goto语句不谈,在图中我们可以很明显的看到break和continue的作用并作出辨识,以此来便利我们在编程语言中不同情况下的使用方法。
那么,我今天的博客到此为止,感谢您认真看完了本篇小白编写的博客,以上均为本人理解,如有错误欢迎在评论区指出。
虽然基础薄弱,但今天仍是在幻想成为大佬的一天。
你要自己发光,而不该总是去折射别人的光芒