C语言-分支与循环(2)

目录

1、while循环

1.1 if 和 while 的对比

1.2 while 语句的执行流程

6.3 while循环简单例题

2、for 循环

2.1 语法形式

2.2 for循环与while循环对比

2.3 for循环的执行流程

2.4 for循环的简单例题

2.5 扩展:for循环的初始化,判断,调整三个部分都是可以省略的

3、do-while 循环

3.1 语法形式

3.2 do-while 循环的执行流程

3.3 do-while循环的简单例题

4、break和continue语句

4.1 while循环中的break 和continue 

4.1.1 break举例

4.1.2 continue举例

4.2 for循环中的break 和continue 

4.2.1 break 举例

4.2.1 continue举例

 4.3 do-while循环中的break和continue

5、循环的嵌套

5.1 例题

5.2 题目分析:

5.3 代码演示

6、goto语句


前言:

嗨嗨嗨!新的一篇来啦!这一次,我携带着满满的关于while、for和do-while等的精彩内容,准备与大家分享。希望你们喜欢这一顿知识的大餐,也希望我的文章能为你的编程之路增添一份乐趣。别忘了,这篇文章也意味着“分支与循环”板块的完美收官哦!期待你们的阅读,我们文末见分晓!


话不多说,直接上正文

1、while循环

C语言提供了3种循环语句,while 就是其中一种,接下来将要介绍一下while语句。

while语句的语法结构和 if 语句非常相似。

1.1 if 和 while 的对比

1 if(表达式)
2          语句;
3
4  while(表达式)
5          语句;//如果循环体想包含更多的语句,可以加上大括号

代码演示:

//代码 1  if#include <stdio.h>int main()
{if(1)printf("hehe \n");//if后边条件满足,打印一次hehereturn 0; 
} //代码 2 while#include <stdio.h>int main()
{while(1)printf("hehe \n");//while后边条件满足,循环打印hehereturn 0; 
} 

代码结果:

代码1:

代码2 :

我们从上面代码结果可以直观的看到他们之间的区别,while语句时可以实现循环效果的。

while 和 if 一样,想要控制多条语句需要加上 {}

代码演示:

#include <stdio.h>
int main()
{while(1){printf("hello \n");printf("China \n");}return 0;
}

代码结果:

1.2 while 语句的执行流程

 #include <stdio.h>
 int main()
{
    while(1)   //while后的表达式称为判断表达式
         printf("hehe \n");
    return 0; 

首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

6.3 while循环简单例题

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

代码演示:

#include <stdio.h>
int main()
{int i = 1;//初始化while (i<=10)//判断{printf("%d\n",i);i++;//调整}return 0;
}

 代码结果:

解读:

i = 1进到while循环,由于i=1 <10,因此表达式为真,打印出1后再加1(后置++),然后 i = 2 再次进入到while 循环,打印出 后再加1,以此类推,当 i = 10进入循环然后打印出来再加 1,i= 11 不满足 i <= 10 的表达式,结果为假,因此循环结束。


while循环落下帷幕,for循环的精彩即将上演
或许你会好奇,为何在拥有while的足智多谋后,我们还需要for的加入?别急,且听我细细道来。
 

2、for 循环

2.1 语法形式

for 循环时三种循环中使用最多的,for 循环的语法形式如下:

1 for (表达式1; 表达式2; 表达式3;)

2      语句: //如果循环体想包含更多语句,可以加上大括号{}

表达式1 :用于循环变量的初始化
表达式2 :用于循环结束条件的判断
表达式3 :用于循环变量的调整

2.2 for循环与while循环对比

while循环代码格式:

#include <stdio.h>
int main()
{int i = 1;//初始化while (i<=10)//判断{printf("%d\n",i);i++;//调整}return 0;
}

从上面代码中,我们可以看到初始化,判断,调整三块是分开的,而且这三个数据无论哪一个变了,都会影响到循环结果。因此,在这个循环比较大的情况下,我们对循环的掌控就没有那么全面,很容易出现错误。

我们在来看for 循环的代码书写格式

 for (表达式1; 表达式2; 表达式3;)初始化    判断    调整语句: //如果循环体想包含更多语句,可以加上大括号{}

for循环中,初始化,判断,调整是整合在一起的。到这应该就明白了为什么for 循环的使用是最多的了吧!for循环在面对大型循环的时候,容错会比while循环高。

总结:for和while在实现循环的过程中都有初始化、判断、调整这三个部分,但是for循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候while循环的三个部分就比较分散,所以从形式上 for循环要更优一些。

2.3 for循环的执行流程

解读:

首先执行 表达式1 初始化循环变量,接下来就是执行 表达式2判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果 !=0 则执行循环语句,循环语句执行完后,再去执行表达式3调整循环变量,然后再去 表达式2 的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

2.4 for循环的简单例题

在屏幕上打印1~10的值

代码演示:

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

演示结果: 

可以看到和while循环结果是相同的,在严格意义上,没有规定必须用哪一个,你可以根据自己的情况来选择,哪一种顺手就用哪一种。

2.5 扩展:for循环的初始化,判断,调整三个部分都是可以省略的

代码演示:

int maiin()
{for( ; ;){printf("hehe\n");}return 0;
}

for循环中的这三个可以同时省略,也可以单个省略。

但是:如果判断部分被省略,那么判断部分就恒为真,就会造成死循环。


for循环的旅程就此结束,接下来是do-while循环的低调亮相时刻。虽然它很少被重用,但它的存在仍然为程序世界增添了一份独特的风采。让我们期待它在特定场景下的精彩表现吧!

3、do-while 循环

3.1 语法形式

在循环语句中do-while 语句的使用最少,它的语法形式如下:

do语句;while(表达式);

whilefor 这两种循环都是先判断,条件如果满足就进入循环执行循环语句,如果不满足就跳出循环;
do while 循环则是先直接进入循环体执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。

3.2 do-while 循环的执行流程

do while循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的结果是 !=0,则继续循环,执行循环语句;判断表达式的结果 ==0,则循环结束。
所以在 do while语句中循环体是至少执行一次的,这是do while循环比较特殊的地方。

3.3 do-while循环的简单例题

在屏幕上打印1~10的值

代码演示:

int main()
{int i = 1;//初始化do{printf("%d ", i);i++;//变量} while (i <= 10);//判断return 0;
}

代码结果: 

4、break和continue语句

4.1 while循环中的break 和continue 

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了 break continue 两个关键字,就是应用到循环中的。
break 的作用是用于永久的终止循环,只要break 被执行,直接就会跳出循环,继续往后执行。    continue 的作用是跳过本次循环中 continue后边的代码,在for 循环和while循环中有所差异的。

4.1.1 break举例

代码演示:打印结果是多少?

int main()
{int i = 1;while (i <= 10){if (i == 5)break;      //当i等于5后,就执行break,循环就终止了printf("%d",i);i++;}return 0;
}

 代码结果:

1 2 3 4

 分析:打印了1,2,3,4后,当 i 等于5的时候,循环在break的地方终止,不再打印,不再循环。
所以 break 的作用就是永久的终止循环,只要break被执行,break外的第一层循环就终止了。
那以后我们在循环中,想在某种条件下终止循环,则可以使用break来完成我们想要的效果。

4.1.2 continue举例

continue 是继续的意思,在循环中的作用就是跳过本次循环中continue后边的代码,继续进行下一次循环的判断。
上面的代码,如果把 break 换成 continue 会是什么结果呢?

代码演示:打印结果是多少?

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

代码结果:

2 3 4 6 7 8 9 10 11

 分析结果:

i=1 进来后遇到 i++ 变为 2,因为2!=5continue未执行,打印 2,然后继续循环,直到 i=5后执行continue,跳过printf,因此5不打印。再来到 i++ 这时 i 的值变为 6,continue未执行,继续打印 6 直到i=10后再加1,循环结束。

  观察continue 的这两组代码,你有发现什么不同吗?

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

没错!  i++ 的位置不同了。那么,为什么我们要将i++的位置调到continue的前面呢?

来,代码结果展示:

这个代码是还在运行的,不过打印完1 2 3 4 后死循环了。

解释一下:continue 的作用是跳过本次循环中 continue后边的代码,因此当i=5进入while循环后continue被执行会直接跳过它后面的两行代码:

  printf(“%d”,i);i++;

然后直接来到while( i<=10)这一行,继续再次进入while循环,continue再次被执行...因此进入死循环。

现在应该明白i++为什么要放到continue前面了吧!

4.2 for循环中的break 和continue 

4.2.1 break 举例

for和while里的break用法一样,不管循环还需要循环多少次,只要执行到了break,循环就会彻底终止。

代码演示:

int main()
{int i = 0;for(i = 1;i <= 10;i++){if(i == 5)break;printf("%d",i);}return 0;
}

代码结果:

1 2 3 4

break的作用是永久终止循环,未来我们在每个条件发生的时候,不想再继续循环的时候,就可以使用break来完成。

4.2.1 continue举例

上面的代码,如果把break换成continue会发生什么结果呢?

 代码演示:

int main()
{int i = 0;for(i = 1;i <= 10;i++){if(i == 5)continue;printf("%d",i);}return 0;
}

 代码结果:

2 3 4 6 7 8 9 10 11

 4.3 do-while循环中的break和continue

do-while语句中的break和continue的作用于while循环中几乎一模一样

#include <stdio.h>
int main()
{int i = 1;do{if(i == 5)break;printf("%d",i);i = i + 1;} while(i<=10);return 0;
}
#include <stdio.h>
int main()
{int i = 1;do{if(i == 5)continue;printf("%d",i);i = i + 1;} while(i<=10);return 0;
}

5、循环的嵌套

在前面,本文详细介绍了三种循环while、for、do-while的使用方法,相信聪明的伙伴们已经掌握了这三种循环的单独使用了把!!但是有句话说的好,人多力量大。当我们把这三种循环嵌套在一起使用时才能够更好的解决问题。这也就是我们所说的:循环嵌套。我们用一道题目来学习循环嵌套。

5.1 例题

找出100~200之间的素数,并打印在屏幕上。

补充:素数又称为质数,指的是只能被 1 本身整除的数字。

5.2 题目分析:

1.要从100~200之前找出素数,首先需要有100~200之间的数,这里能够使用循环来获得。我们可以借助for 循环:for i = 100; i <= 200; i++

2.每次循环产生一个 i 的时候,需要判断 i 是否为素数

怎么判断 i 是否为素数呢?

拿2 ~ i-1 之间的数字去试除 i

如果2 ~ i-1 之间有数字能整除i,那么 i 就不是素数

如果2 ~ i-1 之间的所有数字都不能整除i,i 就是素数

要产生2~i-1之间的数字,这里也能够使用 for 循环解决。

for(j=2; j<=i-1; j++)
{i%j == 0
}

5.3 代码演示

#include <stdio.h>
int main()
{int i = 0;//循环变量for (i = 100; i <= 200; i++)//此for循环的目的:每次循环产生一个i,要判断 i 是否是素数{int flag = 1;//假设i是素数int j = 0;//下面for循环的循环变量for (j = 2; j <= i - 1; j++){if (i % j == 0){flag = 0;//i 不是素数break;//为了直接跳出这次循环 例如:i = 100 进来后被2 整除后就不用在看后面的数字}}if (flag == 1)//如果 i%j !=o,则跳转到这里,即 i为素数,然后打印{printf("%d\n", i);}}return 0;
}

代码里都进行的注释,如果还有不明白的可以私我!

代码结果:

这只是关于求素数的一种方法,后面会专门写一篇关于素数求解的文章 ,期待大家的到来!

这个例子里只用了for循环的循环嵌套,并没有使用到三种循环的嵌套,但是相信聪明的伙伴们应该也能明白怎么使用循环嵌套了吧。!!!

6、goto语句

C语言中提供了一个非常特别的语法,就是goto语句和跳转语句,goto语句可以实现在同一个函数内跳转的设置好的标号处。

goto语句,也被称为无条件转移语句,是一种编程语言构造,它允许控制权直接跳转到程序中指定的标签标记处。

代码演示:

#include <stdio.h>
int main()
{printf("China\n");goto next;printf("xly\n");
next:printf("strong\n");return 0;
}

代码结果:

goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是goto语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用 goto 就非常的方便了。

for(...)
{ror(...){for(...){if(disaster)goto error;}}
}error;

本来 for 循环想提前退出得使用break,一个break 只能跳出一层for循环,如果3层循环嵌套就得使用3个break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。


结语:

分支与循环模块的旅程即将告一段落,希望每位小伙伴都能带着满满的收获继续前行。真诚地说,你们的进步是我最大的快乐源泉!咱们下一段学习之旅再见哦~

本篇文章可以和题目讲解(2)一起食用,效果更佳!!

预告:下篇开始将开启函数模块,期待大家的到来!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django学习入门系列之第四点《图标》

文章目录 图标往期回顾 图标 图标网站&#xff1a; Font Awesome&#xff0c;一套绝佳的图标字体库和CSS框架 (dashgame.com) bootstrap提供的不多 注意&#xff0c;要用框架启动&#xff0c;但用html启动的话是用不了的&#xff08;图标启动不了&#xff09; 如何使用 如果…

DAMA学习笔记(六)-数据安全

1.引言 数据安全包括安全策略和过程的规划、建立与执行&#xff0c;为数据和信息资产提供正确的身份验证、授权、访问和审计。数据安全实践的目标是根据隐私和保密法规、合同协议和业务要求来保护信息资产。这些要求来自以下几个方面: 1&#xff09;利益相关方: 应识别利益相关…

YOLO--置信度(超详细解读)

YOLO&#xff08;You Only Look Once&#xff09;算法中的置信度&#xff08;Confidence&#xff09;是一个关键概念&#xff0c;用于评估模型对预测框内存在目标对象的信心程度以及预测框对目标对象位置的准确性。 一、置信度的定义 数值范围&#xff1a;置信度是一个介于0和…

vscode 打开远程bug vscode Failed to parse remote port from server output

vscode 打开远程bug vscode Failed to parse remote port from server output 原因如图&#xff1a; 解决&#xff1a;

网络滤波器、EMI滤波器与EMC滤波器在电子元器件中的分类关系

在电子工程领域&#xff0c;滤波器作为关键的电子元器件&#xff0c;广泛应用于信号处理、电磁兼容性和电磁干扰抑制等方面。本文将详细介绍网络滤波器、EMI滤波器和EMC滤波器的基本概念、工作原理及其在电子元器件中的分类关系。 一、网络滤波器 网络滤波器是一种通过处理信号…

脸书登录指南:如何在同一台设备登录多个Facebook账号?

海外社媒营销人员和跨境卖家现在越来越依赖社交媒体平台来拓展业务和接触潜在客户&#xff0c;尤其是Facebook。然而&#xff0c;在进行脸书登录时&#xff0c;你可能会问&#xff1a;如何在同一台设备上登录多个Facebook账号&#xff0c;而不违反Facebook的使用条款&#xff1…

Android 性能优化之卡顿优化

文章目录 Android 性能优化之卡顿优化卡顿检测TraceView配置缺点 StricktMode配置违规代码 BlockCanary配置问题代码缺点 ANRANR原因ANRWatchDog监测解决方案 Android 性能优化之卡顿优化 卡顿检测 TraceViewStricktModelBlockCanary TraceView 配置 Debug.startMethodTra…

vivado 2019.2/modelsim SE-64 2019.2联合仿真

参考链接 需要修改的地方&#xff1a; 编译时几个VHDL的库会报错&#xff0c;将language改为verilogfamily只选择当前板子&#xff08;artix-7&#xff09;&#xff0c;速度会更快&#xff0c;错误率更低compile library path最好选择vivado安装路径下的位置&#xff0c;很久之…

怎么创一个新的vue3项目

创建一个新的Vue 3项目可以通过多种方式&#xff0c;以下是基于Vue CLI&#xff08;命令行界面&#xff09;和Vue官方新的脚手架工具create-vue的详细步骤。 使用Vue CLI创建Vue 3项目 安装Vue CLI&#xff1a; 确保你已经安装了Node.js&#xff08;建议使用LTS版本&#xff…

用于大规模图像识别的深度卷积网络

概述 论文地址&#xff1a;https://arxiv.org/pdf/1409.1556.pdf 这项研究探讨了卷积网络深度对图像识别准确性的影响。重要的是&#xff0c;对具有小型卷积滤波器的网络进行的评估表明&#xff0c;具有 16-19 个权重层的深度网络的性能优于传统配置。这些结果使得该模型在20…

把ros消息转换成中文输出

把ros消息转换成中文输出 c实现 发布 //发布性能评估数据 /trilateration_time_log void publishTrilaterationLog(const int reflectorPanelPoints_size,const double duration_count,const std::string& resultType,const std::string& resultChineseMessage,cons…

C#绘制含流动块的管道

1&#xff0c;效果。 2&#xff0c;绘制技巧。 1&#xff0c;流动块的实质是使用Pen的自定义DashStyle绘制的线&#xff0c;并使用线的偏移值呈现出流动的效果。 Pen barPen new Pen(BarColor, BarHeight);barPen.DashStyle DashStyle.Custom;barPen.DashOffset startOffse…

MySQL-日志-优化

目录 介绍一下mysql 的日志 redo log 和binlog 的区别及应用场景 redo log 和 binlog 在恢复数据库有什么区别? redo log 是怎么实现持久化的? redo log除了崩溃恢复还有什么其他作用? &#xff08;顺序写&#xff09; redo log 怎么刷入磁盘的知道吗&#xff1f; 两阶…

重塑水利未来:智慧水利解决方案的探索与实践,从物联网、大数据到人工智能,科技如何赋能水利行业,实现智慧化管理与决策

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

如何通过3D开发组件HOOPS增强Navisworks数据访问?

随着建筑信息模型&#xff08;BIM&#xff09;和建筑、工程和施工&#xff08;AEC&#xff09;市场的快速发展&#xff0c;对Navisworks支持的需求也在不断增长。特别是在多个公司赞助Navisworks项目的大环境下&#xff0c;HOOPS组件的支持显得尤为重要。这些公司包括一家大型电…

【多模态学习笔记二】MINIGPT-4论文阅读

MINIGPT-4:ENHANCING VISION-LANGUAGE UNDERSTANDING WITH ADVANCED LARGE LANGUAGE MODELS 提出的MiniGPT-4使用一个投影层,将冻结的视觉编码器与冻结的先进的LLM Vicuna对齐。我们的工作首次揭示,将视觉特征与先进的大型语言模型正确对齐可以具有GPT-4所展示的许多先进的多…

【14】Github Copilot环境搭建

环境搭建 这里以Visual Studio Code为例&#xff0c;安装好vs code&#xff0c;打开扩展侧边菜单栏&#xff0c;搜索“Github Copilot”&#xff0c;会出现如下图的两个插件&#xff0c;点击安装第一个&#xff0c;另一个会附带一起安装&#xff0c;然后弹出提示重新启动vs co…

对于栈和链表,数组之间关系的一些探索

先贴脸来个图 这是一个解析图&#xff0c;总体是个栈&#xff08;stacks&#xff09;细分有数组和链表【注意这儿的linkedlist可不是Java集合List中的linklist】 对于栈&#xff0c;如果我们想向栈中添加元素&#xff0c;或者想从中删除元素&#xff0c;都必须从一个地方开始&…

阿里云DSW实例中安装并运行Neo4J

想尝试使用大模型对接Neo4J&#xff0c;在阿里云DSW实例中安装了Neo4J&#xff0c;却无法通过本地浏览器访问在DSW实例中运行的Neo4J。尝试了改neo4j.conf文件&#xff0c;以及添加专用网络的公共IP地址等方法&#xff0c;均没有成功。最后决定直接在服务器的命令行进行各种Cyp…

uniapp 页面字体乱码问题解决【已解决】

这个不是我们本身代码的问题&#xff0c;调整一下编译器就好了 打开编译器文件 2,然后以指定编码重新打开&#xff0c;选择utf-8就行了 非常简单 &#xff0c;如果你选择了之后重新渲染页面还是乱码的话&#xff0c;你就把项目关掉&#xff0c;重新启动就OK了。。。