希望每一个想开始而又不敢开始的人,对任何知识都不要抱有恐惧,觉得它很神秘,那样不好,其实知识就在那里一动不动,一层薄纱,去掀开它,你将会看见新的世界。
🌈前言
其实c语言是一门结构化的程序设计语言
c语言支持三种结构:
- 顺序结构
- 选择结构
- 循环结构
本文详细介绍循环结构。
循环语句(循环结构)
前面我们学习了 if语句,但在满足条件的情况下,整个if语句只会执行一次,但在生活中很多的现实例子是:同一件事情我们需要很多完成很多次。
在c语言中也给我们引入了循环语句
c语言支持三个类型的循环执行语句,分别如下:
- while循环
- for循环
- do…while循环
我们依次讲解
1. while循环
1.1 while循环的基本语法
语法结构:
while (表达式)
循环语句;
结构详解:
当满足表达式时,则进入循环语句,直到不满足表达式时,循环结束。
1.1.1 while语句的执行流程
代码示例:
//依次打印1~10的整数,且每个整数之间以空格隔开
int main()
{
int i = 1;//初始化
while (i <= 10)//判断
{
printf("%d ", i);
i++;//调整
}//当i=11的时候,i=11 <= 10,表达式不成立,为假
//即循环结束。
return 0;
}
1.2 while循环的break和continue
1.2.1 break
代码示例:
#include <stdio.h>
int main()
{
int i = 0;//初始化
while (i < 10)(判断)
{
i++;//调整
if (5 == i)//判断
break;//跳出循环
printf("%d ", i);
}//打印结果是1,2,3,4
return 0;
}
代码运行过程详解:
- i = 0 时,满足条件进入循环,i++得到1;
- 进入if语句的判断 ,5 == 1为假,没有进入if 语句执行break;
- 打印 i 即 1 ;
- 再回头继续while循环判断,直到打印i = 4时
- 进入循环 i++得到 5 ;
- 进入if语句的判断,5 == 5为真,进入if语句执行break,直接跳出循环,循环就此终止,因此打印至 i = 4 就此终止;
- 程序结束。
结论:
当运行至关键字break时,程序就停止后期的所有循环,直接终止循环,执行后面的程序(结合流程图)
1.2.2 continue
代码示例:
int main()
{
int i = 0;//初始化
while (i < 10)//判断
{
i++;//调整
if (5 == i)//判断
continue;//跳过后面部分的语句,重新开始循环
printf("%d ", i);
}//打印结果为:1 2 3 4 6 7 8 9 10
return 0;
}
代码运行过程详解:
- i = 0 时,满足条件进入循环,i++得到1;
- 进入if语句的判断 ,5 == 1为假,没有进入if 语句执行continue;
- 打印 i 即 1 ;
- 再回头继续while循环判断,直到打印i = 4时
- 进入循环 i++得到 5 ;
- 进入if语句的判断,5 == 5为真,进入if语句执行continue,后面的printf不执行;
- 重新再回到while语句进行判断,5 依旧满足条件进入循环,i++ 得到6
- 进入if 语句判断,5 == 6为假,不进入if 语句,
- 依次循环,直到打印i = 10时,无法进入循环,循环终止;
- 程序结束。
结论:
程序运行至continue时,是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
1.2.3 break 和 continue的区别
看了上述相似情境下的break和continue的作用机理,应该有了一定的了解。
区别:
- break是直接跳出循环,是永久性的终止;
- continue是终止本次循环,跳过本次循环的后续语句,继续下一次循环,是阶段性的停止。
2. for循环
2.1 for语句
语法结构:
for(表达式1;表达式2;表达式3)
循环语句;
三个表达式的功能:
- 表达式1:初始化,用于循环初始化变量的;
- 表达式2:判断,用于判断循环什么时候终止的 ;
- 表达式3:调整,用于循环条件的调整。
2.1.1 for语句的执行流程
代码示例:
//打印1—10的数字
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}//结合流程图看,打印至10的时候,i++
//i = 11 <= 10为假;
return 0;
}
2.2 for 语句与 while语句对比
2.2.1 基础语法
代码示例:
让两种代码实现相同的功能
//while循环
int i = 0;
i = 1;//初始化部分
while (i <= 10)//判断部分
{
printf("hehe\n");
i++;//调整部分
}
//for循环
for(i = 1;i <= 10;i++ )
{
printf("hehe\n")
}
结论:
可以发现在while循环种依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,查找修改就不够集中和方便。因此for循环的风格更好;for循环的使用频率也最高。
2.2.2 for循环中的break和continue
代码示例:
#include <stdio.h>
int main ()
{
int i = 0;
for(i = 1; i <= 10; i++);
{
if (i == 5)
break ;
printf("%d ",i);
}//1 2 3 4
return 0;
}
代码运行过程详解:
- 进入循环,i = 1;
- 判断i <= 10为真,进入循环,再次判断 i =1 ==5为假,不进入if循环
- 此时打印i =1 ,然后i++,再进入循环
- 当打印至i = 4时,i++得到5,再进入循环判断,i = 5 == 5为真,进入if语句,break直接跳出 循环;
- 程序结束
反思:
在while循环和for循环中,break都是终止循环
#include <stdio.h>
int main ()
{
int i = 0;
for(i = 1; i <= 10; i++);
{
if (i == 5)
continue ;
printf("%d ",i);
}//1 2 3 4 6 7 8 9 10
return 0;
}
代码运行过程详解:
- 进入循环,i = 1;
- 判断i <= 10为真,进入循环,再次判断 i =1 ==5为假,不进入if循环;
3. 此时打印i =1 ,然后i++,再进入循环;- 当打印至i = 4时,i++得到5,再进入循环判断,i = 5 == 5,为真,进入if语句,continue直接跳过本次循环,也就是后续的打印函数;导致i =5 没有打出来、i++得到6再进入判断入口;直到打印i = 10时,循环结束 ;
- 程序结束。
反思:
此时如果是while循环,i++在printf后面,continue会直接跳过调整部分(也就是我们举例的i++);而for循环则依旧会执行调整部分。(可结合流程图)
2.3 for语句的循环控制变量
代码示例:
int i = 0;
//前闭后开的写法
for(i = 1; i < 10; i++)
{}
//两边都是闭区间
for(i = 1; i <= 9; i++)
{}
//两种循环的效果是完全一样的,
//但都是循环10次,因此使用前闭后开,
//代码的展示效果更好,更加清晰明了
建议:
- 不可在for循环体内修改循环变量,防止for循环失去控制;当然,在思路清晰并保证循环可终止的情况下,可以修改变量的。
- 建议for语句的循环控制变量的取值范围采用”前闭后开区间的写法。
2.4 for循环的表达式省略
for循环的初始化部分,判断部分调整部分都是可以省略的。
代码示例:
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}//代码运行会进入死循环一直打印hehe
}
当for循环的所有部分都省略时,代码会进入死循环,且当省略判断部分时,则判断恒为真。所以不要轻易省略
我们先看未省略初始化的情况:
代码示例:
//未省略初始化
int main()
{
int i = 0;
int j = 0;
for (i=0; i < 3; i++)
{
for (j=0; j < 3; j++)
{
printf("hehe\n");
}
} //里三遍,外三遍,外三遍的每一遍里面都三遍,因此打印9个hehe
return 0;
}
再来看看省略初始化的情况
代码示例:
//省略初始化
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hehe\n");
}
}//只打印三个hehe
return 0;
}
代码运行过程详解:
- 当i = 0时,进入外for循环,再进入内for循环,打印至 j =3;
- 内循环结束,i++得1,再进入外循环,到内循环时,j = 3,并没有初始化,i = 3<3为假无法进入内循环;
- 循环至i = 3时;还是直接跳过内循环,外循环也结束,共打印3个hehe。
因此for循环虽然支持省略初始化、调整和判断部分,但在使用时也应该注意不能盲目省略。
3.do…while()循环
3.1 do…while语句
语法结构:
do
循环语句;
while(表达式);
3.1.1 do…while执行流程
3.2 do…while循环特点
代码示例:
#include <stdio.h>
int main ()
{
int i = 1;
do
{
printf("%d ",i);
i++;
}while(i <= 10);//打印 10次hehe
return 0;
}
do…while循环至少会执行一次,因为是先执行后再进行判断;使用场景有限,所以不是经常使用。
3.3 do…while 循环中的 break和 continue
代码示例:
int main()
{
int i = 0;
do
{
i++;
if (i == 5)
break;
printf("%d ", i);
} while (i<10);
return 0;
}//1 2 3 4
代码示例:
int main()
{
int i = 0;
do
{
i++;
if (i == 5)
continue;
printf("%d ", i);
} while (i<10);
return 0;
}//打印1 2 3 4 6 7 8 9 10
//同while一样没有打印5
结论:
- break 在 do…while语句中同for和while中效果一样
- continue 在 do…while语句中会忽略本次循环的后续语句,但while的判断部分依旧会执行。
文章结束啦!咱们下期见😃
如有纰漏还请各位斧正,如果对你有帮助的话,创作不易希望能留下 ”点赞“、”关注“、”评论”三连支持一下博主!🙈
如果有什么疑问或不同的见解,欢迎评论区留言嗷👀,大家一起学习,共同进步! 😉