深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构


🔥个人主页:艾莉丝努力练剑

❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、C/C++干货分享&学习过程记录

🍉学习方向:C/C++方向

⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平



 C++的两个参考文档:

老朋友(非官方文档):cplusplus

官方文档(同步更新):cppreference


目录

一、C语言的循环结构

(一)while循环

(二)do-while循环

(三)for循环

二、循环的效果

(一)嵌套循环

2.1.1  概念

2.1.2  代码示例

3.1.3  注意

(二)循环控制语句

3.2.1  break语句

3.2.2  continue语句

3.2.3  goto语句(不推荐)

(三)实现无限循环

3.3.1  while实现

3.3.2  for实现

3.3.3  使用场景

三、循环的效率以及三种循环的比较与选择

(一)循环的效率

3.1.1  循环条件

3.1.2  循环展开

3.1.3  减少循环内部计算

(二)三种循环的比较与选择

3.2.1  三种循环的比较

3.2.2  三种循环的选择原则

四、循环的常见问题

五、C语言循环的实际应用场景

(一)示例1:查找素数

(二)示例2:冒泡排序

(三)示例3:用户菜单系统


前言:循环结构是编程中控制程序重复执行某段代码的重要工具。C语言提供了多种循环结构,每种都有其特定的使用场景和特点。下面博主会详细介绍C语言中的几种循环结构。


一、C语言的循环结构

(一)while循环

while (condition) {// 循环体
}

特点:

(1)先判断条件,再决定是否执行循环体;

(2)循环次数不确定,取决于条件;

(3)可能一次都不执行(条件初始为假时)。

代码示例:

int count = 0;
while (count < 5) 
{printf("Count is %d\n", count);count++;
}

应用场景:

(1)当循环次数不确定时;

(2)需要先检查条件再决定是否执行循环时。

(二)do-while循环

do {// 循环体
} while (condition);

特点:

(1)先执行循环体,再判断条件;

(2)至少会执行一次循环体;

(3)条件为真时继续循环。

代码示例:

int num;
do {printf("Enter a positive number: ");scanf("%d", &num);
} while (num <= 0);

应用场景:

(1)需要至少执行一次循环体时;

(2)输入验证等需要先执行再判断的情况。

(三)for循环

这家伙的出场率真是高。

for (initialization; condition; increment/decrement) {// 循环体
}

特点:

(1)结构紧凑,将初始化、条件判断和更新放在一起;

(2)循环次数通常比较明确;

(3)初始化部分只执行一次。

代码示例:

我们就举一个最简单的例子:依次输出0~9——

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

应用场景:

(1)循环次数已知或可计算时;

(2)需要同时管理初始化、条件和更新的情况。

二、循环的效果

(一)嵌套循环

2.1.1  概念

嵌套循环:在一个循环体内包含另一个完整的循环结构。

2.1.2  代码示例

下面就是一个嵌套循环的写法——

for (int i = 1; i <= 3; i++) 
{for (int j = 1; j <= 3; j++) {printf("%d * %d = %d\t", i, j, i * j);}printf("\n");
}
3.1.3  注意

(1)内层循环完全执行完毕后,外层循环才会进入下一次迭代;

(2)避免过度嵌套(一般不超过3层),以免降低代码可读性。

(二)循环控制语句

掌握分支循环(二):三种循环、break和continue语句、循环的嵌套以及 goto 语句

3.2.1  break语句

作用:

(1)立即终止当前循环;

(2)用于switch结构或循环结构中。

代码演示:

for (int i = 0; i < 10; i++) 
{if (i == 5) {break;  // 当i等于5时退出循环}printf("%d ", i);
}
3.2.2  continue语句

作用:

(1)跳过当前循环的剩余部分,直接进入下一次循环;

(2)仅用于循环结构中。

代码演示:

for (int i = 0; i < 10; i++) 
{if (i % 2 == 0) {continue;  // 跳过偶数}printf("%d ", i);
}
3.2.3  goto语句(不推荐)

作用:

(1)无条件跳转到指定标签处;

(2)破坏程序结构,应尽量避免使用

话虽如此,goto语句也并不是一无是处——

多层循环的代码中,如果想快速跳出,使用 goto 语句就非常的方便了,比如:

for(...)
{for(...){for(...){if(disaster)goto error;}}
}error://...

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

(三)实现无限循环

3.3.1  while实现
while (1) 
{// 循环体
}
3.3.2  for实现
for (;;) 
{// 循环体
}
3.3.3  使用场景

(1)需要永久运行的循环(如事件循环);

(2)通常配合break语句在特定条件下退出。

三、循环的效率以及三种循环的比较与选择

(一)循环的效率

3.1.1  循环条件

避免在循环条件中使用复杂计算——

好:

int len = strlen(s); for (int i = 0; i < len; i++)

不好:

for (int i = 0; i < strlen(s); i++)
3.1.2  循环展开

减少循环次数以提升性能——

for (int i = 0; i < 100; i += 5) 
{// 处理i// 处理i+1// ...// 处理i+4
}
3.1.3  减少循环内部计算

它会将不变的计算移到循环外部。

(二)三种循环的比较与选择

3.2.1  三种循环的比较

三种循环的比较如下表所示——

循环类型特点适用场景
while先判断,可能不执行循环次数不确定
do-while先执行一次,再判断至少执行一次
for初始化、条件、更新集中管理循环次数已知或可计算
3.2.2  三种循环的选择原则

选择原则:

1、当循环次数已知时,优先使用 for 循环

2、当循环至少要执行一次时,考虑 do - while 循环

3、其他情况使用 while 循环

时间复杂度的问题前面博主已经详细介绍过了,这里不再赘述,大家可以去看这篇文章——

【数据结构】详解算法复杂度:时间复杂度和空间复杂度

对于时间复杂度和空间复杂度的知识点介绍得还是非常详细的。

四、循环的常见问题

4.1  无限循环问题:忘记更新循环变量——

int i = 0;
while (i < 10) 
{printf("%d ", i);// 忘记i++
}

4.2  分号问题:循环体后误加分号——非常常见的一个问题——

for (int i = 0; i < 10; i++);  // 这个分号会导致循环体为空
{printf("%d ", i);
}

4.3  浮点数比较问题:使用浮点数作为循环变量可能导致精度问题——

for (float f = 0.0; f != 1.0; f += 0.1) 
{printf("%f ", f);
}

不推荐用浮点数作为循环变量。

4.4  修改循环变量问题:在循环体内修改循环变量可能导致意外行为——

for (int i = 0; i < 10; i++) 
{if (i == 5) {i = 8;  // 直接跳转}printf("%d ", i);
}

在循环体内修改循环变量可能会导致直接跳转的问题产生。

五、C语言循环的实际应用场景

这里我们直接展示代码,就不展开具体说明了。

(一)示例1:查找素数

#include <stdio.h>
#include <stdbool.h>bool is_prime(int n) 
{if (n <= 1) return false;for (int i = 2; i * i <= n; i++) {if (n % i == 0) return false;}return true;
}int main() 
{int limit = 100;printf("Prime numbers up to %d:\n", limit);for (int num = 2; num <= limit; num++) {if (is_prime(num)) {printf("%d ", num);}}return 0;
}

(二)示例2:冒泡排序

void bubble_sort(int arr[], int size) 
{for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

(三)示例3:用户菜单系统

#include <stdio.h>int main() 
{int choice;do {printf("\nMenu:\n");printf("1. Option 1\n");printf("2. Option 2\n");printf("3. Exit\n");printf("Enter your choice: ");scanf("%d", &choice);switch (choice) {case 1:printf("You selected Option 1\n");break;case 2:printf("You selected Option 2\n");break;case 3:printf("Exiting...\n");break;default:printf("Invalid choice. Try again.\n");}} while (choice != 3);return 0;
}

总结:

(1)while 循环适用于循环次数不确定的情况;

(2)do - while 循环适用于至少需要执行一次的情况;

(3)for 循环适用于循环次数已知的情况;

(4)嵌套循环可以处理多维数据或多重条件;

(5)控制语句里的 breakcontinue 可以更灵活地控制循环流程。

往期回顾:

【C/C++】详解内存对齐问题,C语言内存对齐整理

结语:本文内容到这里就结束了,大家不要忘了给博主“一键四连”哦!

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

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

相关文章

北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧

今天没去教室&#xff0c;因为下午有个线下面试。其实是可以去教室的&#xff0c;但我实在太焦虑了&#xff0c;我觉得去了教室我心情会更不好&#xff0c;什么都干不下去&#xff0c;所以我选择不去早上依旧是带着满满焦虑起来的&#xff0c;会觉得自己的一切都不令自己满意&a…

在ubuntu服务器下安装cuda和cudnn(笔记)

目录 0 引言 1 相关环境查询 2 安装cuda 2.1 下载并安装 2.2 安装选项配置 2.3 验证安装 3 安装cudnn 3.1 下载 3.2 解压 3.3 删除旧版本 cuDNN 3.4 复制新文件到 CUDA 目录 3.5 设置文件权限 3.6 创建软链接 3.7 验证安装 0 引言 我在使用服务器的cuda11.8的时…

docker安装centos

docker库地址https://hub.docker.com/ 尝试使用centos7试了几次超时 换了个版本就可以了 docker pull centos:centos7.9.2009有时候需要更新资源地址 可以使用 vim /etc/docker/daemon.json配置其他资源地址 {"registry-mirrors": ["http://hub-mirror.c.163…

内容索引之word转md工具 - markitdown

切分文档构建RAG库过程中&#xff0c;langchain、llamaindex更期望处理latex、md类带有显式结构文档。 langchain、llamaindex切分word&#xff0c;有可能将段落中间截断&#xff0c;导致切分后的块语义不完整。 所以&#xff0c;需要先将word转化为md格式&#xff0c;然后再…

MaxKB+合合信息TextIn:通过API实现PDF扫描件的文档审核

上海合合信息科技股份有限公司&#xff08;以下简称为合合信息&#xff09;是一家深耕人工智能、OCR&#xff08;光学字符识别&#xff09;及商业大数据技术领域的科技企业。该公司拥有领先的智能文字识别技术&#xff0c;其名片全能王&#xff08;CamCard&#xff09;、扫描全…

MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查

目录 一、什么是 MyBatis&#xff1f;为什么要用它&#xff1f; 二、MyBatis 核心概念&#xff08;通俗理解&#xff09; 1.SqlSessionFactory 2.SqlSession 3.Mapper接口 4.映射文件&#xff08;XML&#xff09; 三、手把手搭建第一个 MyBatis 项目 1. 准备工作 2. 核心配置文…

数据结构初阶(12)排序算法—插入排序(插入、希尔)(动图演示)

2. 常见排序算法的实现2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一种简单的插入排序法&#xff1a;基本思想把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中。直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 比 挪 (…

MySQL优化常用的几个方法

本实例是对慢sql从2万优化到5千优化方法的汇总。 首先贴上优化效果&#xff1a;1、更新数据时使用ID更新&#xff1b;2、"分页/轮询"查询时先获取符合数据要求主键的最大和最小ID&#xff0c;然后WHERE条件增加ID步增查询&#xff1b;3、检查SQL是否命中WHERE条件&am…

深入解析 AUTOSAR:汽车软件开发的革命性架构

引言在汽车智能化、网联化、电动化浪潮席卷全球的今天&#xff0c;汽车电子系统的复杂性与日俱增。传统“烟囱式”的 ECU 开发模式&#xff08;各供应商独立开发软硬件&#xff09;带来了巨大的兼容性、复用性和维护成本挑战。AUTOSAR&#xff08;AUTomotive Open System ARchi…

计算机视觉(opencv)实战一——图像本质、数字矩阵、RGB + 图片基本操作(灰度、裁剪、替换等)

OpenCV 入门教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、机器学习等领域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模块。本文将带你一步步掌握 cv2…

《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》

前引&#xff1a;在STL的关联式容器中&#xff0c;set以其严格的元素唯一性和自动排序特性成为处理有序数据的核心工具。其底层基于红黑树&#xff08;Red-Black Tree&#xff09;实现&#xff0c;保证了O(log n)的查找、插入与删除复杂度&#xff01;本文将从底层原理切入&…

各测试平台功能对比分析(ITP,Postman,Apifox,MeterSphere)

对比ITP与Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口测试✅ 可视化接口调试&#xff0c;支持多种请求方式✅ 支持✅ 支持✅ 支持场景测试✅ 多接口串联测试&#xff0c;支持前后置脚本✅ Collections功能✅ 支持✅ 支持定时任务✅ 基于Celery的定时…

开源日志log4cplus—如何将 string类型转为tstring类型,又如何将char*类型转换为tstring类型?

文章目录&#x1f527; 一、理解 log4cplus::tstring 的本质⚙️ 二、std::string 转 tstring 的三种方法✅ 1. 使用内置宏 LOG4CPLUS_STRING_TO_TSTRING&#xff08;推荐&#xff09;✅ 2. 手动条件编译转换&#xff08;精细控制&#xff09;✅ 3. 多字节模式下的直接赋值⚙️…

深度学习之CNN网络简介

CNN网络简单介绍 1.概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种专门用于处理具有网格状结构数据的深度学习模型。 ​ CNN网络主要有三部分构成&#xff1a;卷积层、池化层和全连接层构成&#xff0c;其中卷积层负责提取图像中…

【微实验】基频提取的MATLAB实现(优化版)

前情提要&#xff1a; 【超详细】科普&#xff1a;别再只会用自相关&#xff01;YIN 和 PYIN 如何破解音频隐藏密码&#xff1f;-CSDN博客 【微实验】妈妈我的MATLAB会识别声音的基频了&#xff01;-CSDN博客 今天用MATLAB把算法封装成函数&#xff0c;然后调用对比结果。 …

开发 npm 包【详细教程】(含发布 npm 包,版本号升级,修改包后重新发布等)

1. 给 npm 包取个【唯一】的名字&#xff01; npm 包命名规范 只能包含小写字母&#xff08;a-z&#xff09;、数字&#xff08;0-9&#xff09;、连字符&#xff08;-&#xff09; 和 下划线&#xff08;_&#xff09;&#xff0c;不能包含空格、大写字母、标点符号&#xff…

Secure 第三天作业

实验需求&#xff1a;1.参考以上拓扑所示&#xff0c;完成以下需求&#xff1a;1&#xff09; 配置各设备 IP 地址2&#xff09; 配置 ZBFW&#xff0c;Inside-1 和 nside-2 属于内部 Zone&#xff0c;Outside-1 属于外部 Zonezone security insidezone security outsidezone-p…

Linux应用层-5.计算机网络(菜鸟学习笔记)

计算机网络的核心是连接与通信&#xff0c;从底层的物理信号到上层的应用服务&#xff0c;各层协议协同工作---------------------------------------------------------------------------------------一.计算机网络分类&#xff08;按范围&#xff09;1•个人区域网&#xff…

[论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼

大型语言模型对决传统方法&#xff1a;多语言漏洞修复能力大比拼 论文阅读&#xff1a;On the Evaluation of Large Language Models in Multilingual Vulnerability RepairarXiv:2508.03470 On the Evaluation of Large Language Models in Multilingual Vulnerability Repair…

计算机网络2-3:传输方式

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工以及全双工通信 总结 串行传输和并行传输 并行传输的优点是速度为串行传输的n倍&#xff0c;但也存在一个严重的缺点即成本高 同步传输和异步传输 单工、半双工以及全双工通信 总结