【C语言】3.C语言分支和循环(2)


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

如何区分breakcontinue

break:跳出循环体。

continue:跳出本次循环,继续下一次循环。

在这里插入图片描述


6.3 while 循环的实践

练习:在屏幕上打印 1~10 的值。

int main()
{
     int a = 1;
     while(a<=10){
         printf("%d ", a);
         a++;
     }
     return 0;
}

这里空格用⏹️来表示。

  1. 先定义一个变量a,并给它赋值为1.
  2. 进入while循环,判断a<=10是否为真(也就是条件成不成立)
  3. 条件为真,执行while循环里面的步骤。
  4. 打印1⏹️,然后执行a++
  5. 执行完后a的值为2,重新进入while循环的语句判断,发现a<=10仍然为真。
  6. 打印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;
  1. for循环先执行表达式1
  2. 然后判断表达式2是否为真,如果表达式2为真,那么执行语句1。
  3. 语句1执行完,执行表达式3
  4. 然后判断表达式2是否为真,如果表达式2为真,那么执行语句1。
  5. 继续执行,直到判断表达式2为假,然后跳出for循环。
  6. 跳出循环后,执行语句2。

7.3 for循环的实践

练习:在屏幕上打印1~10的值

int main(){
	int i;
    for(i=0;i<=10;i++){
        printf("%d ",i);
    }
    return 0;
}
  1. 定义变量i

  2. 进入for循环,先执行表达式1i=0

  3. 然后判断表达式2i<=10为真,执行语句printf("%d ",i);

  4. 语句执行完执行表达式3i++

  5. 执行完表达式3后i=2

  6. 然后判断表达式2i<=10为真

  7. 继续循环

  8. 直到i++后i的值为11

  9. 判断表达式2i<=10为假

  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(表达式);
  1. 在 do while 循环中先执行“语句1”

  2. 执行完语句,在去执行“表达式”,判断表达式的结果

  3. 如果表达式的值为真,则继续循环,执行“语句1”

  4. 如果判断表达式的结果为假,则循环结束。

所以在 do while 语句中循环体是至少执行一次


8.3 do while循环的实例

在屏幕上打印1~10的值

int main(){
     int i = 1;
     do{
         printf("%d ", i);
         i++;
     }while(i<=10);
     return 0;
}
  1. 定义i的值为1
  2. 进入do while 循环体
  3. 执行printf("%d ", i);输出i的值1
  4. 执行i++;,i的值从1变成2
  5. 进入while的判断语句,满足i<=10,条件为真
  6. 重新进入循环体,执行printf("%d ", i);输出i的值2
  7. 继续循环
  8. 直到i++后i的值是11
  9. 进入while的判断语句,不满足i<=10,条件为假
  10. 跳出循环
  11. 执行return 0;
  12. 结束

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

解析:

  1. 定义i的值为1
  2. 进入 while 判断语句,判断i<=10为真
  3. 进入循环体,进行if判断
  4. 因为i的值为1,不满足i == 5,条件为假,所以这个if语句不执行
  5. 执行printf("%d ", i);,打印出i的值1
  6. 执行i++,i的值变成2
  7. 进入 while 判断语句,判断i<=10为真
  8. 继续循环
  9. 直到i++后的值变成5✨
  10. 进入 while 判断语句,判断i<=10为真
  11. 进入循环体,进行if判断
  12. 因为i的值为5,满足i == 5,条件为真,进入if语句
  13. 执行break;跳出循环体。(注意:if不是循环体,是判断语句)
  14. while循环结束,执行return 0;
  15. 函数结束

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

解析:

  1. 定义i的值为1
  2. 进入 while 判断语句,判断i<=10为真
  3. 进入循环体,进行if判断
  4. 因为i的值为1,不满足i == 5,条件为假,所以这个if语句不执行
  5. 执行printf("%d ", i);,打印出i的值1
  6. 执行i++,i的值变成2
  7. 进入 while 判断语句,判断i<=10为真
  8. 继续循环
  9. 直到i++后的值变成5✨
  10. 进入 while 判断语句,判断i<=10为真
  11. 进入循环体,进行if判断
  12. 因为i的值为5,满足i == 5,条件为真,进入if语句
  13. 执行continue;,进入循环进行判断的地方
  14. 经过判断,i<=10为真
  15. 进入循环体,进行if判断
  16. 然后继续循环
  17. 陷入死循环😡

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

解析:

  1. 定义i的值为0

  2. 进入for的表达式1,给i赋值为1.

  3. 进入表达式2,经过判断,i<=10为真,执行if语句

  4. 经过判断,i == 5为假 ,执行printf("%d ", i);打印1

  5. 进入表达式3,执行i++,把i的值从1变成2

  6. 进入表达式2,经过判断,i<=10为真,执行if语句

  7. 继续循环

  8. 直到i++后i值为5

  9. 进入表达式2,经过判断,i<=10为真,执行if语句✨

  10. 因为i的值是5,经过判断,i == 5为真 ,执行break;

  11. 跳出循环体

  12. for循环结束,执行return 0;

  13. 函数结束


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

解析:

  1. 定义i的值为0
  2. 进入for的表达式1,给i赋值为1.
  3. 进入表达式2,经过判断,i<=10为真,执行if语句
  4. 经过判断,i == 5为假 ,执行printf("%d ", i);打印1
  5. 进入表达式3,执行i++,把i的值从1变成2
  6. 进入表达式2,经过判断,i<=10为真,执行if语句
  7. 继续循环
  8. 直到i++后i值为5
  9. 进入表达式2,经过判断,i<=10为真,执行if语句✨
  10. 因为i的值是5,经过判断,i == 5为真 ,执行continue;
  11. 进入表达式3,执行i++,把i的值从5变成6
  12. 进入表达式2,经过判断,i<=10为真,执行if语句
  13. 经过判断,i == 5为假 ,执行printf("%d ", i);打印6
  14. 进入表达式3,执行i++,把i的值从6变成7
  15. 继续循环
  16. 直到i++后i值为11
  17. 进入表达式2,经过判断,i<=10为假,不执行for循环
  18. for循环结束,执行return 0;
  19. 函数结束

9.3 do while循环中的break和continue

do.while 语句中的 break 和 continue 的作用和 while 循环中几乎一模一样,这里就不过多展示了。

在这里插入图片描述


10.循环的嵌套

三种循环 whiledo whilefor ,这三种循环往往会嵌套在一起才能更好的解决问题。

来道题目练练手:

找出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;
}

看不懂代码里注释的就看解析吧:

  1. 进入main函数 先定义i的值为1

  2. 然后进入下面的循环,这个循环是为了产生100~200的数字

  3. 进入外层for循环,表达式1i=100先把i赋值为100

  4. 然后表达式2进行判断,i<=200为真,进入循环

  5. 定义了变量j的值为0,和变量flag的值为1(如果经历了循环后,flag的值还为1,那么i就是素数)

  6. 然后进入下一个for循环,表达式1j=2先把j的值赋成了2

  7. 然后表达式2进行判断,j<i为真,进入循环体

  8. 执行if判断,i % j == 0为假,执行表达式3,j++,j的值从2变成了3

  9. 然后表达式2进行判断,j<i为真,进入循环体

  10. 内层 for语句不断循环,如果循环完了都没有执行break跳出,那么i就是素数。

  11. 如果中间i % j == 0为真,那么就说明j是i的因数,说明i不是素数。直接break跳出内层for循环

  12. 然后执行外层for循环的表达式3i++,i的值从100变成了101

  13. 然后外层for循环表达式2进行判断,i<=200为真,进入循环

  14. 继续循环

  15. 直到外层经过i++后i的值是201

  16. 然后外层for循环表达式2进行判断,i<=200为假,不进入循环

  17. for循环结束,执行return 0;

  18. 函数结束

写到眼花缭乱了😭


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的打印

解析:

  1. 进入 main函数,执行printf("hehe\n");打印hehe
  2. 执行好后 进入下一个语句,发现goto next
  3. 跳转到next:
  4. 执行printf("跳过了haha的打印\n"); 打印跳过了haha的打印
  5. 执行return 0;
  6. 函数结束

在这里插入图片描述
求个三连~

  • 35
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值