前言:循环语句是C语言中的重要组成部分,该部分也比较基础,希望大家好好学习,多动手实践,学完本节加上前面的分支语句,就已经可以实现大部分功能了。加油各位!
一、while 循环
*标准的while循环语句:
//bool_value的值决定了循环与否,如果是真则循环,如果是假不循环,此处常为判断表达式,与前文的if里的概念相似
while(bool_value)
{
//循环内容;
}
循环的意义所在,就是减少重复代码的编写,使代码的可读性提高。例如:向屏幕依次打印1到100,如果写一百行代码,太麻烦了。那么我们用while循环语句来实现这个功能就非常简便了。下面,上代码。
int i=1;//从几开始,我们就初始化为几
while(i<=100)//当i小于等于100的时候进入循环体进行打印,否则就不进入
{
printf("%d\n",i);
i=i+1;//每次增加1
//掌握后熟练运用运算操作符就可以将循环体简化为一行代码
//printf("%d\n",i++);
}
下面介绍两个关键字continue 和 break
int i=0;
while(true)//或while(1)一直进行循环
{
if(i<1)
{
i++;
continue;
}
if(i>100) break;
printf("%d\n",i);
i++;
}
这里我们没有直接将i赋值为1.而是从0开始,但我们还想打印1到100,怎么办,那就加一条作为判断的语句,i的值如果比1小,我们就 让加1,然后continue 跳过本次循环直到i加到1时正常参与循环的打印功能。聪明的小伙伴还注意到了一点,那就是,while的判断条件里是true(或1),一直循环怎么才能跳出循环执行后续代码呢,很简单,博主写了另一行作为判断的语句,当i比100大的时候就break打断循环。实际的运行如下。(ps:这里我们事先知道了i是从0开始的才这么设计代码的,不然还需要分析实际情况,优化本代码或进行更多的判断来确保每一种情况都能完成题目要求)
*do...while循环语句
另外,while 和 do关键字构成了新的循环语句,即do...while语句。它和while语句类似,就不作过多讲解,只谈二者的区别。
do...while与while最本质的区别就在于前者会先进行一次循环,然后进行条件判断,而后者在最开始就进行判断再选择是否进行循环。这也就导致了do...while循环语句至少经历一次循环。下面我们尝试一下用两种方法解决上述问题。
#include <stdio.h>
int main()
{
int i=1;
while(i<=100)
{
printf("%-5d\n",i);
i++;
}
printf("-----------------------------------------------------");//分割线
i=1;//重新赋值
do
{
printf("%-5d\n",i);
}while(i<=100);//注意分号
return 0;
}
乍看之下,结果一样,那还要do...while语句干嘛呢。实则不然,do-while循环适用于不知道循环具体执行次数,只知道满足某个条件继续执行或结束执行,并且循环肯定执行一次时的场景。有没有例子呢,肯定有的。下面,请听题:
#include "stdio.h"
#include "math.h"
int main()
{
double t1,t2,t;
int m=1
int n=1;
do{
t1 = m*1.0/n;
t2 = t1;
t = m+n;
m = n;
n = t;
}while(fabs(t1-t2)>1e-5);
printf("常数=%.3f\n",t2);
return 0;
}
这时候我们得先经历一次循环为t1和t2确定具体的值才能进行判断,如果直接判断就需要将赋值操作在循环之前就进行一次,在这里只是重复了两行代码,但是如果在有些大项目里,可能就比较多了,代码显得十分冗余,可读性极差。所以要知道,存在即有意义,只是我们习惯于使用while,这样就省去了一些时间精力去分辨要不要先执行一次的问题。但学习嘛,就要打牢根基,一步一个脚印,不是没有while常用,学一个就能解决问题了没必要多学了,我们就不去学了,这是一个错误的认知和学习习惯。
二、for循环
for循环语句的基本语法:
for(表达式1;表达式2;表达式3)
{
//循环体;
}
其中:表达式1-->赋值列表;表达式2-->条件判断语句;表达式3-->循环结束附加操作语句。
同样我们需要打印1-100这些数字,让我们来用for循环语句实现一下。
for(int i=1;i<=100;i++)//在有些编译环境下这里会报错,不能在表达式1处定义变量并初始化,只能对已有变量进行赋值操作
{
printf("%d\n",i);
}
//等价于
int i=1;
while(i<=100)
{
printf("%d\n",i);
i++;
}
聪明的人已经发现规律了,如果你已经理解了while循环,那么恭喜你也已经了解了for循环。但,还不够。
int i=1;
for(;;)
{
printf("%d\n",i);
i++;
if(i>100)break;
}
这段代码告诉我们,for语句里的表达式可以为空,除了赋值外的所有操作都可以在循环体内进行。
int i,j;
for(i=1,j=0;i<=100;i++,j++)
{
//此处为空语句
}
printf("j=%d",j);//输出为j=100,也就是循环的次数
这段代码告诉我们,循环体可以为空,另外,既然是列表那就可以对多个变量进行赋值,追加操作也可以是多个(此时注意,和;的使用即可)。
善于思考的同学又该问了,那能不能表达式为空,循环体也为空呢。可以,让我们看一下
for(;;)
{ }
//其实他就等价于
while(1)
{ }
这就是典型的两个死循环。此外,对于for循环语句我们只能省略表达式,但“ ; ”不可以省略喔。
其实到这里,你已经基本掌握了它的各种情况。为什么没有说完全掌握,那是因为,循环还有嵌套的情况没有叙述,下节我们就专门讲解循环的嵌套使用。
三、goto语句的跳转循环功能
goto语句又被称为无条件跳转语句,用于改变语句执行顺序。也正是因为无条件跳转,导致goto跳转语句不太常用,因为在庞大的项目里,它会使逻辑变得混乱,不宜理解以及维护修改。但既然存在,我们就要说一下它的作用和用法以及如何用跳转实现循环功能。
//首先,基本语法
goto Mark;
//注意,mark是自己标注的,在符合命名规则的约束下可以任意起名字
语法的基本定义是苍白无力的,想要更好的理解,需要用示例来作为辅助手段。请看示例代码
#include <stdio.h>
int main()
{
printf("aaaaaa\n");
goto Mark;
printf("bbbbbb\n");
Mark:
printf("cccccc\n");
return 0;
}
正常情况下,代码按顺序执行,结果应该为aaaaaa-\n-bbbbbb-\n-cccccc。但实际情况却是:
跳过了printf("bbbbbb\n");这条输出语句。这就好比switch..case一样,根据case通道执行其后的操作,不回转,只往下进行。是不是好理解了一点。goto无条件跳转语句 可以与if语句搭配来形成有条件的跳转。我们顺便也将其如何实现循环也一并说了。还是老例子,打印1-100,使用goto实现。
#include <stdio.h>
int main()
{
int i=1;
START:
printf("%d\n",i++);
if(i>100) goto EXIT;
else goto START;
EXIT:
return 0;
}
重要的事情不怕说,希望大家记住,慎用goto语句。它会使得程序的执行循序变得混乱,cpu需要不停地进行跳转,效率比较低,而且goto语句任何程序可以修改,程序中如果出现多处相同的标签会使得程序逻辑变得复杂,因此,在开发中时慎用goto语句。但其也有应用场景,如下所示:
*------------------------------------------------------------------------------------------------------------------------------*
注意:下节课我们要讲循环的嵌套使用,这节课看完之后在网上找点题练习一下,多练多敲代码,发现问题,总结规律才是王道。