承接上篇,本篇我们来介绍循环语句
目录
循环语句
while
for
do while
📍go to
循环语句
循环语句简而言之就是如果满足循环条件,则进入循环,不满足就会跳出循环,在初识C语言种我们已经介绍了while循环的简单步骤以及基本的使用方法,通过上篇对分支语句的学习,我们也应该会使用分支语句,然而这两者可以嵌套使用,本篇会再介绍几种循环语句的使用。
1.while循环
我们已经掌握了分支语句的基本用法,但是在分支语句中如果判断条件满足,只会执行一次,但是通常情况我们都需要进行多次判断,因此就要将分支语句引用进循环语句里面,这样就可以实现多次判断,多次执行,直到某一天不满足循环条件则会跳出循环。
语法结构:
//while 语法结构
while(表达式)
{
循环语句;
}
比如:在屏幕上打印1~10
代码演示:
//while循环
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10) //设置循环条件,控制打印10次
{
printf("%d ", i);
i++; //每一次进入循环i++直到i不满足循环条件
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/9763a28f40076646ab6c5dd7b0ef8cdf.png)
上述代码已经帮我们了解了while循环的基本语法,接下来我们再来学习学习while循环中新的东西
1.1while循环中的break
break介绍:
break在分支语句里面我们见到过,在循环中也常常使用,其作用是终止循环
//break代码实例
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
printf("END\n");
break;
}
printf("%d ", i);
i++;
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/9ae69a7b6b2cccfcfc65b6ba937f3361.png)
可以看到,当i等于5时打印了END然后执行break跳出循环
总结:
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
1.2while循环中的continue
关于continue还是第一次遇见,它在循环中也起着一定的作用
//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/f1086f14769bce7882248b1c6bcf21bc.png)
可以看到这个代码打印出来的只有1 2 3 4,但是代码还没有停止,进入了死循环
//continue 代码实例2
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/30f561c8366c60028b1196341f9f46bc.png)
可以看到,这段打印出的没有5,这就很奇怪,那continue到底有着怎样的效果呢?
总结:
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。也就是说只要条件满足遇到了continue,无论continue后面有多少串代码都不执行,直接跳转到循环的判断条件入口处,进行下一次的判断
看到这里就会对代码1中的死循环有所理解
小知识点:while循环条件将会比循环体多执行一次
2.for循环
我们已经学了while循环,我们再来了解for循环,两者各有优势,循环效果是一样的。
语法结构:
for(表达式1; 表达式2; 表达式3)
{
循环语句;
}
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
例如:使用for循环在屏幕上打印1~10
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/fd28dacb9592e6e42ae13bf1dd9d237d.png)
使用for循环也可以很好的打印出1~10,而且简洁明了,所以呢,for循环使用频率较高
2.1while循环和for循环比较
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
通过比较可以发现,在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,如果我们写了上百行代码,假设要修改其中的三个循环必要条件都会变得不方便,所以,for循环的风格更胜一筹;for循环使用的频率也最高。但是在某些地方要合理选择,两种方法使用得当才可以使你的代码逻辑变得清晰
2.2for循环中的break
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/3541c297ae2d0fc9e7ab4d50225ea52c.png)
break在for循环中也是起着终止循环的功能。
2.3for循环中的continue
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/21a658dbbc7b51004d5147a255e90852.png)
2.4for语句的循环控制变量
建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
//i=2;不可在for 循环体内修改循环变量
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
2.5for循环的变种
代码1:
#include <stdio.h>
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0;
}
for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
如果省略判断部分就意味着判断恒为真,就进入了死循环。
代码2:
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int n = 0; //使用n来统计
//这里打印多少个hehe?
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
n++;
printf("hehe ");
printf("%d ",n);
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/d977ece62bc1b45536ae9e54a6bae6e0.png)
一共打印100个hehe,在i=0时j有10中情况,i=1时j也有10中情况,以此类推就是10*10个hehe,所以for循环也可以嵌套使用。
代码3:
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for (; i < 10; i++) //循环1
{
for (; j < 10; j++) //循环2
{
printf("hehe ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/ad6cbd7177afc21cb7559a8bd72f0a67.png)
如果省略了初始化的部分,就打印了10个hehe,这是为什么呢?是因为当i等于0时,进入循环1,j等于0;进入循环2然后打印第一个hehe,j++等于1,再打印一个hehe,直到j等于10,打印了10个hehe,然后出循环2,这时i++等于1,走到循环2,这时由于没有对上一次的j进行初始化,这时的j等于10,不满足循环2(j<10),所以无法进入循环2,然后i++等于2,再走到循环2,又因为没有对j进行初始化,所以又不满足循环2的条件,所以呀,直到i++等于到10,都无法再进入循环2,所以这个代码只打印10个hehe。这也就告诉我们不要随便省略条件,老老实实写上基本不会出错。
代码4:
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
可以看到,for循环里面不一定只有一个变量来控制循环,有时会有多个变量来同时控制,因为for语法结构里面规定的是表达式来控制。所以控制循环的可以是一个变量也可以是多个变量。
2.6for循环笔试题
下面的代码一共可以执行多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
大家可以仔细思考一下,在文章后面我会公布答案
3.do while循环
语法结构:
do
{
循环语句;
}while(表达式);
3.1 do while循环特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
代码演示:
//打印1~10的数
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
do while循环先执行循环语句再进行判断,所以至少都要执行一次循环语句
3.2do while循环中的break
代码演示:
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/aae440ba5dcbac2812013b6c2b6581e8.png)
break在do while中的作用也是终止循环
3.3do while循环中的continue
代码演示:
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/951e4f6a10b22295b50f777f8ab45177.png)
在do while循环中的continue也是跳过continue下面的语句直接跳转到判断部分,所以当i等于5时就进入了死循环
📍go to语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
}
error:
if(disaster)
如果我们写了很多的循环,如果要一次性跳转出整个循环的话很不方便,所以就可以使用go to语句
笔试题解析
下面的代码一共可以执行多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
在做题之前我们得分清楚‘=’和‘==’,前者是赋值,后者是相等,那我们再看这段代码,i和k先初始化为0,然后进入for循环,再对i和k进行初始化,这时到了判断部分,但这时的判断部分是k=0;意思是将0赋值给k,并不是k==0,又因为0是假,所以不会进入循环,因此这段代码执行0次。