6.while循环
6.1 if 和 while的对⽐
if语句后面的条件满足,下面的语句执行一次。
int main()
{
if(1)
printf("hehe\n"); //if后边条件满足,打印一次hehe
return 0;
}
while语句后面的条件满足,下面的语句不断执行。
int main()
{
while(1)
printf("hehe\n"); //while后边的条件满足,不断循环的打印hehe
return 0;
}
和if语句相比while语句是可以实现循环效果的。
6.2 while语句的执⾏流程
while(a){
语句1;
}
如果a为真,那么就循环执行语句1。如果a为假,就不执行语句1。
那么,a为真的时候,难道这个死循环不能停止吗?
当然可以停止。
while(a){
语句1;
break;
}
比如break
就可以停止死循环。
如果a为真,那么就执行语句1,然后执行break
。执行break
会直接跳出这个while语句,就不会继续循环了。
还有一个continue
在while语句里面也有特殊的用法。
while(a){
语句1;
continue;
语句2;
}
如果a为真,那么就执行语句1,然后执行continue
。
执行了continue
后,就会跳出本次循环,while语句继续判断a是否为真。
然后继续执行语句1,然后执行continue
。
如何区分
break
和continue
:
break
:跳出循环体。
continue
:跳出本次循环,继续下一次循环。
6.3 while 循环的实践
练习:在屏幕上打印 1~10 的值。
int main()
{
int a = 1;
while(a<=10){
printf("%d ", a);
a++;
}
return 0;
}
这里空格用⏹️来表示。
- 先定义一个变量a,并给它赋值为1.
- 进入while循环,判断
a<=10
是否为真(也就是条件成不成立) - 条件为真,执行while循环里面的步骤。
- 打印
1⏹️
,然后执行a++
。 - 执行完后a的值为2,重新进入while循环的语句判断,发现
a<=10
仍然为真。 - 打印
2⏹️
,然后执行a++
。
一直执行到完成a++
之后,a的值为11,重新进入while循环的语句判断,发现a<=10
为假。
至此,循环结束 。
7.for循环
7.1 语法形式
for(表达式1; 表达式2; 表达式3)
语句;
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
举个小例子方便理解。
int main(){
int i;
for(i=0;i<=10;i++){
printf("%d ",i);
}
}
7.2 for循环的执⾏流程
for(表达式1; 表达式2; 表达式3){
语句1;
}
语句2;
- for循环先执行
表达式1
。 - 然后判断
表达式2
是否为真,如果表达式2
为真,那么执行语句1。 - 语句1执行完,执行
表达式3
。 - 然后判断
表达式2
是否为真,如果表达式2
为真,那么执行语句1。 - 继续执行,直到判断
表达式2
为假,然后跳出for循环。 - 跳出循环后,执行语句2。
7.3 for循环的实践
练习:在屏幕上打印1~10的值
int main(){
int i;
for(i=0;i<=10;i++){
printf("%d ",i);
}
return 0;
}
-
定义变量i
-
进入for循环,先执行表达式1
i=0
-
然后判断表达式2
i<=10
为真,执行语句printf("%d ",i);
-
语句执行完执行表达式3
i++
-
执行完表达式3后
i=2
-
然后判断表达式2
i<=10
为真 -
继续循环
-
直到
i++
后i的值为11 -
判断表达式2
i<=10
为假 -
跳出for循环,程序结束
7.4 while循环和for循环的对⽐
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分。
for 循环的三个部分非常集中,便于代码的维护。
而如果代码较多的时候 while 循环的三个部分就比较分散。
8.do-while循环
8.1 语法形式
do{
语句;
}while(表达式);
while 和 for 都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
do while 循环则是先循环,再判断。表达式为真,就会进行下一次,表达式为假,则不再继续循环。
注意:while(表达式);
这个分号别漏了!!!
8.2 do while循环的执⾏流程
do{
语句1;
}while(表达式);
-
在 do while 循环中先执行“语句1”
-
执行完语句,在去执行“表达式”,判断表达式的结果
-
如果表达式的值为真,则继续循环,执行“语句1”
-
如果判断表达式的结果为假,则循环结束。
所以在 do while 语句中循环体是至少执行一次!
8.3 do while循环的实例
在屏幕上打印1~10的值
int main(){
int i = 1;
do{
printf("%d ", i);
i++;
}while(i<=10);
return 0;
}
- 定义i的值为1
- 进入do while 循环体
- 执行
printf("%d ", i);
输出i的值1 - 执行
i++;
,i的值从1变成2 - 进入while的判断语句,满足
i<=10
,条件为真 - 重新进入循环体,执行
printf("%d ", i);
输出i的值2 - 继续循环
- 直到
i++
后i的值是11 - 进入while的判断语句,不满足
i<=10
,条件为假 - 跳出循环
- 执行
return 0;
- 结束
9.break和continue语句
9.1 while循环中的break和continue
9.1.1 break举例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10){
if(i == 5){
break;//这里的break跳出了while循环
}
printf("%d ", i);
i++;
}
return 0;
}
打印:
1 2 3 4
解析:
- 定义i的值为1
- 进入 while 判断语句,判断
i<=10
为真 - 进入循环体,进行if判断
- 因为i的值为1,不满足
i == 5
,条件为假,所以这个if语句不执行 - 执行
printf("%d ", i);
,打印出i的值1 - 执行
i++
,i的值变成2 - 进入 while 判断语句,判断
i<=10
为真 - 继续循环
- 直到
i++
后的值变成5✨ - 进入 while 判断语句,判断
i<=10
为真 - 进入循环体,进行if判断
- 因为i的值为5,满足
i == 5
,条件为真,进入if语句 - 执行
break;
跳出循环体。(注意:if不是循环体,是判断语句) - while循环结束,执行
return 0;
- 函数结束
9.1.2 continue举例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10){
if(i == 5){
continue;//这里的continue会让程序去循环的判断的地方,因为这里跳过了i = i+1,所以i一直为5,程序陷入和死循环
}
printf("%d ", i);
i++;
}
return 0;
}
打印:
1 2 3 4 5 5 5 ....//进入死循环,后面全是5
解析:
- 定义i的值为1
- 进入 while 判断语句,判断
i<=10
为真 - 进入循环体,进行if判断
- 因为i的值为1,不满足
i == 5
,条件为假,所以这个if语句不执行 - 执行
printf("%d ", i);
,打印出i的值1 - 执行
i++
,i的值变成2 - 进入 while 判断语句,判断
i<=10
为真 - 继续循环
- 直到
i++
后的值变成5✨ - 进入 while 判断语句,判断
i<=10
为真 - 进入循环体,进行if判断
- 因为i的值为5,满足
i == 5
,条件为真,进入if语句 - 执行
continue;
,进入循环进行判断的地方 - 经过判断,
i<=10
为真 - 进入循环体,进行if判断
- 然后继续循环
- 陷入死循环😡
9.2 for循环中的break和continue
9.2.1 break 举例
int main(){
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5){
break;//这里break跳出了循环体
}
printf("%d ", i);
}
return 0;
}
打印:
1 2 3 4
解析:
-
定义i的值为0
-
进入for的表达式1,给i赋值为1.
-
进入表达式2,经过判断,
i<=10
为真,执行if语句 -
经过判断,
i == 5
为假 ,执行printf("%d ", i);
打印1 -
进入表达式3,执行
i++
,把i的值从1变成2 -
进入表达式2,经过判断,
i<=10
为真,执行if语句 -
继续循环
-
直到
i++
后i值为5 -
进入表达式2,经过判断,
i<=10
为真,执行if语句✨ -
因为i的值是5,经过判断,
i == 5
为真 ,执行break;
✨ -
跳出循环体
-
for循环结束,执行
return 0;
-
函数结束
9.2.2 continue举例
int main(){
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5){
continue;//这里continue跳过了后边的:printf("%d ", i);来到了i++
}
printf("%d ", i);
}
return 0;
}
打印:
1 2 3 4 6 7 8 9 10//里面没有5
解析:
- 定义i的值为0
- 进入for的表达式1,给i赋值为1.
- 进入表达式2,经过判断,
i<=10
为真,执行if语句 - 经过判断,
i == 5
为假 ,执行printf("%d ", i);
打印1 - 进入表达式3,执行
i++
,把i的值从1变成2 - 进入表达式2,经过判断,
i<=10
为真,执行if语句 - 继续循环
- 直到
i++
后i值为5 - 进入表达式2,经过判断,
i<=10
为真,执行if语句✨ - 因为i的值是5,经过判断,
i == 5
为真 ,执行continue;
✨ - 进入表达式3,执行
i++
,把i的值从5变成6 - 进入表达式2,经过判断,
i<=10
为真,执行if语句 - 经过判断,
i == 5
为假 ,执行printf("%d ", i);
打印6 - 进入表达式3,执行
i++
,把i的值从6变成7 - 继续循环
- 直到
i++
后i值为11 - 进入表达式2,经过判断,
i<=10
为假,不执行for循环 - for循环结束,执行
return 0;
- 函数结束
9.3 do while循环中的break和continue
do.while 语句中的 break 和 continue 的作用和 while 循环中几乎一模一样,这里就不过多展示了。
10.循环的嵌套
三种循环 while
, do while
, for
,这三种循环往往会嵌套在一起才能更好的解决问题。
来道题目练练手:
找出100~200之间的素数,并打印在屏幕上。
(注:素数又称质数,只能被1和本身整除的数字)
#include <stdio.h>
int main()
{
int i = 0;
//循环产生100~200的数字
for(i=100; i<=200; i++)
{
//判断i是否为素数
//循环产生2~i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for(j=2; j<i; j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ", i);
}
return 0;
}
看不懂代码里注释的就看解析吧:
-
进入main函数 先定义i的值为1
-
然后进入下面的循环,这个循环是为了产生100~200的数字
-
进入外层for循环,表达式1
i=100
先把i赋值为100 -
然后表达式2进行判断,
i<=200
为真,进入循环 -
定义了变量j的值为0,和变量flag的值为1(如果经历了循环后,flag的值还为1,那么i就是素数)
-
然后进入下一个for循环,表达式1
j=2
先把j的值赋成了2 -
然后表达式2进行判断,
j<i
为真,进入循环体 -
执行if判断,
i % j == 0
为假,执行表达式3,j++
,j的值从2变成了3 -
然后表达式2进行判断,
j<i
为真,进入循环体 -
内层 for语句不断循环,如果循环完了都没有执行break跳出,那么i就是素数。
-
如果中间
i % j == 0
为真,那么就说明j是i的因数,说明i不是素数。直接break跳出内层for循环 -
然后执行外层for循环的表达式3
i++
,i的值从100变成了101 -
然后外层for循环表达式2进行判断,
i<=200
为真,进入循环 -
继续循环
-
直到外层经过
i++
后i的值是201 -
然后外层for循环表达式2进行判断,
i<=200
为假,不进入循环 -
for循环结束,执行
return 0;
-
函数结束
写到眼花缭乱了😭
11.goto语句
goto 语句可以实现在同一个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;//直接跳到next那边去了
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
打印:
hehe
跳过了haha的打印
解析:
- 进入 main函数,执行
printf("hehe\n");
打印hehe
- 执行好后 进入下一个语句,发现
goto next
- 跳转到
next:
- 执行
printf("跳过了haha的打印\n");
打印跳过了haha的打印
- 执行
return 0;
- 函数结束
求个三连~