当前位置:网站首页>[详解C语言]一文带你玩转循环结构(for_while_do-while)
[详解C语言]一文带你玩转循环结构(for_while_do-while)
2022-07-26 22:47:00 【Zoroxs】
循环结构
总述
生活中不止处处是选择,还时常面临着重复做某事,比如呢,我们日复一日的学习、敲代码、
C语言中提供了 —while循环—for循环—do-while循环来表达循环

接下来,对三种循环进行分别介绍
while循环
while循环的流程图大致就是这样子

语法结构
while( expression ) //判断表达式是否成立,成立就执行循环体,不成立则不进入
循环体;
接下来我们使用一下while循环,打印1-10的数字
#include <stdio.h>
int main(){
int i = 1;
while(i < 11)
printf("%d ",i++);
return 0;
}

这便是while最简单的用法,接下来看一下while中的break和continue
while循环中break和continue
break
看到break大家肯定不陌生,选择结构中的switch-case就要搭配着break使用哦
#include <stdio.h>
int main(){
int i = 1;
while(i < 11)
{
if( 5 == i)
break;
printf("%d ",i++);
}
return 0;
}

可以看出,当i=5的时候,直接跳出了整个循环不再执行
break是直接跳出循环,也是直接跳出switch-case
continue
在英语中,continue是继续的意思 ,在循环中,表示跳过这次循环进行下一次循环
#include <stdio.h>
int main() {
int i = 1;
while (i < 11)
{
if (5 == i)
continue; // 把break换成continue试一下
printf("%d ", i++);
}
return 0;
}
大家可以猜一下,可想而知,大家可能会认为结果是 1 2 3 4 6 7 8 9 10 跳过5,我们来分析一下


光标一直在闪烁,死循环,那怎么样才能达到跳过5的效果呢,
核心问题在于**这样i的值没办法变化,那我们把i放在continue前面来试试**
#include <stdio.h>
int main() {
int i = 0;
while (i < 11)
{
i++;
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
这样continue就不会跳过循环因子 -i 的变化,所以不会死循环,来看结果

成功跳过了5,大家在while循环中使用continue时一定要注意循环因子的问题
continue 在while循环中的作用就是:
- 本次循环中continue后边的代码不会再执行而是直接跳转到while语句的判断部分。
- 进行下一次循环的入口判断。
for循环
语法结构
for( 表达式1 ; 表达式2 ; 表达式3)
循环体;
- 表达式1为**初始化部分,用于初始化循环变量的**。
- 表达式2为_条件判断部分_,用于**判断循环时候终止**。
- 表达式3为_调整部分_,用于**_循环条件的调整 _**。

for循环中break和continue
break
for循环中break与while循环中break完全相同,表示跳出循环
#include <stdio.h>
int main() {
int i = 0;
for (i = 1; i < 10; i++) {
if (5 == i)
break;
printf("%d ", i);
}
return 0;
}

break基本没啥区别,就是跳出循环
continue
for循环中continue跳出的依然是此次循环,但是并不会跳过表达式3
#include <stdio.h>
int main() {
int i = 0;
for (i = 1; i < 10; i++) {
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}

依然是跳过5,continue不会跳过表达式3,意味着i++可以执行,不会造成死循环
当然,一个人想写bug谁也拦不住他
比如:

for循环中省略表达式的问题
for循环中有3个表达式,都可以省略,但是分号一个不能少
int main(){
int i = 0;
//可以写成这样
for (i=0;i<10;)
;
//还可以这样
for(i = 0;;)
;
//甚至是这样
for(;;); //三分号一个也不能少
}
for(;; 这样的代码,如果循环体中没有break,基本就是妥妥死循环,并不建议大家这样使用
for循环嵌套
当出现两个for循环的时候,需要考虑循环控制的问题,行列,内外循环都代表什么?大家需要想清楚
写一个九九乘法表
#include <stdio.h>
int main() {
int i = 0;
int j = 0;
for (i = 1; i < 10; i++) {
//控制行
for (j = 1; j <= i; j++) {
printf("%d * %d = %d ", j, i, i * j); //控制列
}
printf("\n");
}
return 0;
}
一般情况下,内层循环因子的控制条件都和外层循环因子有关系
下面给大家几个for循环的注意事项
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法
#include <stdio.h>
int main(){
int arr[10] = {
1,2,3,4,5,6,7,8,9,10};//数组下标从0到9
int i = 0;
for(;i <=9;i++) //前闭后闭
printf("%d ",arr[i]);
for(;i < 10;i++)//前闭后开
printf("%d ",arr[i]);
return 0;
}
前闭后开区间的写法,可能使数字有了某种含义,比如例子中的10,刚好是打印元素的个数,也是数组的长度
给大家补充一个小知识
警惕for循环后边直接跟分号的题,学校爱出这玩意,懂得都懂
do-while循环
do-while循环与其他两种循环有很大不同,而也是使用频率最小的循环
do
循环体
while(判断条件);

do-while循环最大的特点就是无论如何,循环体一定会执行一次
只有在对应场景中,才应该使用do-while循环
do-while循环中,break以及continue的用法与while循环中一样,本文不在赘述。
goto语句
对于goto语句,是一种跳转,其实没必要说,因为能用它解决的用循环都能解决
简单介绍一下,但是并不推荐大家使用
#include <stdio.h>
int main()
{
printf("hehe\n");
goto flag;
printf("haha\n");
flag:
printf("heihei\n");
return 0;
}
goto 会直接跳转到flag标记处,跳过打印haha

这只是goto语句的语法
goto语句真正使用在多层循环嵌套中,跳出循环,使用break达不到,只能跳出一次,这些后续碰到再说
总结
- for循环对于初始化、条件、循环因子的控制都在一起
- do-while循环的循环体至少执行一次
- goto不推荐大家使用
- 各种循环各有千秋,大家要根据对应的场景,选择对应的循环,达到需求
- 本文只是对循环语法进行了介绍,对于循环,大家要勤加练习, 多思考
注:
- 本文所有见解,为本人拙见,如有误导,请多指教
- 如果对您有所帮助,点赞支持一下
边栏推荐
- (hdu1588) Gauss Fibonacci (sum of matrix fast power + bisection matrix proportional sequence)
- C language foundation Gobang, very easy to understand, detailed explanation, easy to use
- Merge sort (recursive and non recursive writing)
- 7.16 多益网络笔试
- IO function of standard C library
- When El table is selected, the jump page remains selected
- 6.29 众安暑期测开实习一面
- mysql视图
- 云数据库管理初体验
- Mysql database - interview questions
猜你喜欢
随机推荐
The bottom implementation of string container
Flink1.13.6详细部署方式
left join 、inner join 、right join区别
Es specify user name and password when instantiating resthighlevelclient
Run NPM run dev to run 'NPM audit fix' to fix them, or 'NPM audit' for details
(hdu1588) Gauss Fibonacci (sum of matrix fast power + bisection matrix proportional sequence)
平面转换(位移、旋转、缩放)
mysql一个select语句的执行过程
行,表,页,共享,排他,悲观,乐观,死锁
Virtualization technology KVM
js求最大值?
JS逻辑运算符
[FPGA tutorial case 28] one of DDS direct digital frequency synthesizers based on FPGA -- principle introduction
IO function of standard C library
shell课程总结
Desktop solution summary
MySQL备份恢复
Docker高级篇之Mysql主从复制、Redis集群扩容缩容配置案例详解
[untitled]
shell课程总结









![[FPGA tutorial case 28] one of DDS direct digital frequency synthesizers based on FPGA -- principle introduction](/img/bf/ce4bc33d2a0fc7fe57105e20fbafcf.png)