C语言的循环while、for、do…while…
1、while循环
while(表达式)
{
语句;
}
先判断表达式,为真时执行while里面的语句,执行大括号中的语句之后,再次回到while处的表达式判断其是否为真,如果为真则继续向下执行,所以我们可以看到当表达式为真时,while下面大阔号括起来的语句会一直循环,直到表达式为假时则跳出循环。
举例:
inti=1;//初始化变量while(i<=8)//判断循环条件,即表达式{printf("%d ",i);//打印i++;//打印完i自加1}当我们运行上述程序,你会得到1 2 3 4 5 6 7 8 .
那我们来走一次这个程序:
(1)第一轮:当i=1时,判断i是否小于等于8,1是小于8 的执行循环体while大括号里面的内容,打印i=1,之后执行i++,此时i=2。回到while处判断循环条件是否成立。
(2)第二轮:当i=2时,判断i是否小于等于8,2是小于8 的执行循环体while大括号里面的内容,打印i=2,之后执行i++,此时i=3。回到while处判断循环条件是否成立。
(3)第三轮:当i=3时,判断i是否小于等于8,3是小于8 的执行循环体while大括号里面的内容,打印i=3,之后执行i++,此时i=4。回到while处判断循环条件是否成立。
(4)第四轮:当i=4时,判断i是否小于等于8,4是小于8 的执行循环体while大括号里面的内容,打印i=4,之后执行i++,此时i=5。回到while处判断循环条件是否成立。
(5)第五轮:当i=5时,判断i是否小于等于8,5是小于8 的执行循环体while大括号里面的内容,打印i=5,之后执行i++,此时i=6。回到while处判断循环条件是否成立。
(6)第六轮:当i=6时,判断i是否小于等于8,6是小于8 的执行循环体while大括号里面的内容,打印i=6,之后执行i++,此时i=7。回到while处判断循环条件是否成立。
(7)第七轮:当i=7时,判断i是否小于等于8,7是小于8 的执行循环体while大括号里面的内容,打印i=7,之后执行i++,此时i=8。回到while处判断循环条件是否成立。
(8)第八轮:当i=8时,判断i是否小于等于8,8是等于8 的执行循环体while大括号里面的内容,打印i=8,之后执行i++,此时i=9。回到while处判断循环条件是否成立。
(8)第八轮:当i=9时,判断i是否小于等于8,9是大于8 的不满足循环条件,此时结束循环。
可以看到while这个循环轮次,展示了典型的while循环执行流程:条件检查→执行语句→计数器更新→下一轮循环。在算法中,这样的循环结构常用于需要重复执行固定次数的场景,比如遍历数组、重复计算等。
2、for循环
for(表达式1;表达式2;表达式3)
{
语句;
}
我们先来解释一下这个for循环的结构:
(1)表达式1:表示初始化,如:int i=0。而这个表达式只执行一次。
(2)表达式2:判断部分,即满足条件则继续循环,不满足则停止循环。
(3)表达式3:调整部分,如:i++,i–。
这三个部分都可以省略不写:for(;;) .
但是判断部分省略会使循环条件恒成立,导致死循环。
同样也使用for循环实现打印数字1-8:
for(inti=1;i<=8;i++){printf("%d ",i);}上述程序还可以表示为:
inti=0;for(i=1;i<=8;i++){printf("%d ",i);}是一样的,只是第一个它是初始化和赋值一起操作了,第二个分开了而已。
当我们运行上述程序,你会得到1 2 3 4 5 6 7 8 .那我们来走一次这个程序:
(1)初始化阶段:i被初始化为1,这表示循环的起点为1.
(2)条件检查:
每次循环开始前都执行一次判断条件,如:
满足i<=8条件为真,则执行循环体里面的语句打印i的值。
不满足i<=8条件(即i>8)则条件为假,停止循环。
(3)当条件为真,则执行printf("%d ",i);语句,打印i
(4)执行完循环体(即大括号中的语句后),执行增量i++,自加后的i又回到判断条件进行判断(此时i=2,将2与8相比)
(5)一直重复上述操作。
(6)直到当i=9时,则不满足i<=8的条件,那么循环停止,不再执行循环体中的语句。
对比for循环和while循环,我们把这两个程序拿出来看一下:
这个是while语句构成的循环:
这个是for语句构成的循环:
两个进行对比,图中红色的框表示的是初始化,蓝色的框表示判断条件,紫色的框为调整部分。所以,不管是for循环还是while循环都包含这三个表达式,但for循环的表达形式更为紧凑,while循环会分散一些。所以使用for循环时,循环体中语句太多的时候,千万不要忘了调整部分表达式。
这两种循环方式都可以实现同样的效果,但对于while()循环常用于不清楚具体循环次数的程序中,而for循环用于循环次数明确的地方。(这只是小建议)
当我们了解了这两个循环,我们是不是可以尝试实现:求1-100中3的倍数。
(我觉得刚学习编程,对我来说比较重要的是思考,然后理清楚逻辑,实现的办法。所以我在完成程序的时候会一步一步的告诉自己要实现什么,然后再去调试,不满足要求在修改。)
为了实现1-100中3的倍数,那解题思路:
(1)首先应该实现数字1-100,那么可以通过循环将这100个数字实现。
(2)其次有了所有的数字,那么就要从这些数字中寻找3的倍数。
说到3的倍数,这是什么意思?3、6、9、12、15…这些是不是都是3的倍数,我们是不是可以理解为3的倍数就是可以被3整除的数。那么如果要被3整除,没有余数。所以我们可以对数字求3的模判断是否为0,如果余数为零,则是3的倍数,不为零,则不是3的倍数。这个地方可以使用判断。
(3)最后找到一个3的倍数是不是要打印出来看看结果对不对?如果不对那么修改程序。
根据上述的思路我们走一遍(这里我们使用for循环,本人比较喜欢for循环)
(1)使用for循环实现1-100;
for(inti=1;i<=100;i++)//从1可开始100结束(2)3整除,没有余数
i%3==0(3) 打印出来看看结果
printf("%d",i);好,将这三个语句组合起来实现功能:
#include<stdio.h>intmain(){for(i=1;i<=100;i++){if(i%3){printf("%d",i);}}return0;}上面的程序 便可实现1-100里3的倍数数字打印。
3、do…while…循环
do
{
语句;
}
while(表达式);
这个循环体有一个特点,就是不管一开始条件是否满足都会先执行一次。即先执行大括号中的语句,然后在判断表达式是否为真,确定是否进行下一个循环。
例:
#include<stdio.h>intmain(){inti=0;do{printf("haha\n");}while(i>0);}输出为haha。
对比之前的循环,会先判断条件表达式是否满足(即先判断i>0满不满足要求,在本题中i=0则是不满足的,则不会执行循环体)。但do…while…循环不一样,他先执行一次do后面大括号中的循环体语句,然后再判断i是否大于零。
4、break和continue
说到循环就不得不提到break和continue,之前在分支switch语句时也出现了break,那这两个又是什么语句呢?首先明确他们的概念:
(1)break:表示永久终止循环,执行时只要遇到了break 那么不管之后还有多少次循环都不再执行,跳出循环体,向下执行。
例:
intmain(){inti=0;inta=0;for(i=1;i<=4;i++)//循环4次{if(i==3)//i等于3时跳出循环{break;}printf("%d\n",i);打印i}a=8;printf("%d\n",a);return0;}上述程序打印出来的是1 2 8,为什么?
原本这个循环他应该执行4次的,但是遇到break语句之后提前终止的循环,那么他具体怎么实现的:
(1)第一轮:当i=1时,判断i是否小于等于4,1是小于4 的执行循环体while大括号里面的内容,由于1不等于3,即不满足if条件语句中的表达式,所以不会执行if语句大括号里面的内容,直接执行打印i=1,之后执行i++,此时i=2。
(2)第二轮:当i=2时,判断i是否小于等于4,2是小于4 的执行循环体while大括号里面的内容,由于2不等于3,即不满足if条件语句中的表达式,所以不会执行if语句大括号里面的内容,直接执行打印i=2,之后执行i++,此时i=3。
(3)第三轮:当i=3时,判断i是否小于等于4,3是小于4 的执行循环体while大括号里面的内容,由于3等于3,即满足if条件语句中的表达式,所以执行if语句大括号里面的内容break语句,此时直接跳出循环不再执行打印。
(4)跳出循环后还需要按顺序执行循环外的语句,将8赋值给a并打印出来。
所以为什么后面要加上
a = 8;
printf(“%d\n”, a);
这两句话,是为了让大家清楚break只是跳出了循环体,不执行后面的循环了,不是跳出结束了整个程序。
(2)continue:表示跳过本次循环continue后面的代码,执行下一次循环。
例:
intmain(){inti=0;inta=0;for(i=1;i<=4;i++){if(i==3){continue;}printf("%d\n",i);}a=8;printf("%d\n",a);return0;}我将上面的代码做了一个修改,即将break语句置换成了continue,这个时候所得到的效果就不一样了。
这便是打印出来的效果,大家可以看到,他只是跳过了3这次循环,后面的循环依旧执行。那么他具体怎么实现的:
(1)第一轮:当i=1时,判断i是否小于等于4,1是小于4 的执行循环体while大括号里面的内容,由于1不等于3,即不满足if条件语句中的表达式,所以不会执行if语句大括号里面的内容,直接执行打印i=1,之后执行i++,此时i=2。
(2)第二轮:当i=2时,判断i是否小于等于4,2是小于4 的执行循环体while大括号里面的内容,由于2不等于3,即不满足if条件语句中的表达式,所以不会执行if语句大括号里面的内容,直接执行打印i=2,之后执行i++,此时i=3。
(3)第三轮:当i=3时,判断i是否小于等于4,3是小于4 的执行循环体while大括号里面的内容,由于3等于3,即满足if条件语句中的表达式,所以执行if语句大括号里面的内容continue语句,此时直接跳出本次循环不再执行continue语句后面的打印语句所以3便没有打印出来。之后执行i++,此时i=4。
(4)第四轮:当i=4时,判断i是否小于等于4,4是等于4 的执行循环体while大括号里面的内容,由于3等于3,即满足if条件语句中的表达式,所以执行if语句大括号里面的内容continue语句,即不满足if条件语句中的表达式,所以不会执行if语句大括号里面的内容,直接执行打印i=4,之后执行i++,此时i=5。5就不满足循环要求了,所以直接结束循环了。
这里有一个可以给大家拿去思考的程序,本人感觉挺有意思的,放上来让大家看看:
intmain(){inti=1;while(i<=10){if(i==5){continue;}printf("%d ",i);i++;}}大家可以想象看这个程序的输出是什么呢?
以上是循环的内容,但不是所有,因为循环还有goto语句,本人对该循环不是特别清楚,待本人学习清楚了再给大家描述。
同样的,写的不好请各位担待,本人一定虚心接受指正,争取更上一层六。