
🔥个人主页:艾莉丝努力练剑
❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、C/C++干货分享&学习过程记录
🍉学习方向:C/C++方向
⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平

C++的两个参考文档:
老朋友(非官方文档):cplusplus
官方文档(同步更新):cppreference
目录
[2.1.1 概念](#2.1.1 概念)
[2.1.2 代码示例](#2.1.2 代码示例)
[3.1.3 注意](#3.1.3 注意)
[3.2.1 break语句](#3.2.1 break语句)
[3.2.2 continue语句](#3.2.2 continue语句)
[3.2.3 goto语句(不推荐)](#3.2.3 goto语句(不推荐))
[3.3.1 while实现](#3.3.1 while实现)
[3.3.2 for实现](#3.3.2 for实现)
[3.3.3 使用场景](#3.3.3 使用场景)
[3.1.1 循环条件](#3.1.1 循环条件)
[3.1.2 循环展开](#3.1.2 循环展开)
[3.1.3 减少循环内部计算](#3.1.3 减少循环内部计算)
[3.2.1 三种循环的比较](#3.2.1 三种循环的比较)
[3.2.2 三种循环的选择原则](#3.2.2 三种循环的选择原则)
**前言:**循环结构是编程中控制程序重复执行某段代码的重要工具。C语言提供了多种循环结构,每种都有其特定的使用场景和特点。下面博主会详细介绍C语言中的几种循环结构。
一、C语言的循环结构
(一)while循环

cpp
while (condition) {
// 循环体
}
特点:
(1)先判断条件,再决定是否执行循环体;
(2)循环次数不确定,取决于条件;
(3)可能一次都不执行(条件初始为假时)。
代码示例:
cpp
int count = 0;
while (count < 5)
{
printf("Count is %d\n", count);
count++;
}
应用场景:
(1)当循环次数不确定时;
(2)需要先检查条件再决定是否执行循环时。
(二)do-while循环

cpp
do {
// 循环体
} while (condition);
特点:
(1)先执行循环体,再判断条件;
(2)至少会执行一次循环体;
(3)条件为真时继续循环。
代码示例:
cpp
int num;
do {
printf("Enter a positive number: ");
scanf("%d", &num);
} while (num <= 0);
应用场景:
(1)需要至少执行一次循环体时;
(2)输入验证等需要先执行再判断的情况。
(三)for循环

这家伙的出场率真是高。
cpp
for (initialization; condition; increment/decrement) {
// 循环体
}
特点:
(1)结构紧凑,将初始化、条件判断和更新放在一起;
(2)循环次数通常比较明确;
(3)初始化部分只执行一次。
代码示例:
我们就举一个最简单的例子:依次输出0~9------
cpp
for (int i = 0; i < 10; i++)
{
printf("%d ", i);
}
应用场景:
(1)循环次数已知或可计算时;
(2)需要同时管理初始化、条件和更新的情况。
二、循环的效果
(一)嵌套循环
2.1.1 概念
**嵌套循环:**在一个循环体内包含另一个完整的循环结构。
2.1.2 代码示例
下面就是一个嵌套循环的写法------
cpp
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结构或循环结构中。
代码演示:
cpp
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break; // 当i等于5时退出循环
}
printf("%d ", i);
}
3.2.2 continue语句
作用:
(1)跳过当前循环的剩余部分,直接进入下一次循环;
(2)仅用于循环结构中。
代码演示:
cpp
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
continue; // 跳过偶数
}
printf("%d ", i);
}
3.2.3 goto语句(不推荐)

作用:
(1)无条件跳转到指定标签处;
(2)破坏程序结构,应尽量避免使用。
话虽如此,goto语句也并不是一无是处------
在多层循环的代码中,如果想快速跳出,使用 goto 语句就非常的方便了,比如:
cpp
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
上图中的代码中,原本 for 循环想提前退出得使用 break ,一个 break 只能跳出一层 for 循环,如果3层循环嵌套,就得使用3个 break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。
(三)实现无限循环
3.3.1 while实现
cpp
while (1)
{
// 循环体
}
3.3.2 for实现
cpp
for (;;)
{
// 循环体
}
3.3.3 使用场景
(1)需要永久运行的循环(如事件循环);
(2)通常配合break语句在特定条件下退出。
三、循环的效率以及三种循环的比较与选择
(一)循环的效率
3.1.1 循环条件
避免在循环条件中使用复杂计算------
好:
cpp
int len = strlen(s); for (int i = 0; i < len; i++)
不好:
cpp
for (int i = 0; i < strlen(s); i++)
3.1.2 循环展开
减少循环次数以提升性能------
cpp
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 无限循环问题:忘记更新循环变量------
cpp
int i = 0;
while (i < 10)
{
printf("%d ", i);
// 忘记i++
}
4.2 分号问题:循环体后误加分号------非常常见的一个问题------
cpp
for (int i = 0; i < 10; i++); // 这个分号会导致循环体为空
{
printf("%d ", i);
}
4.3 浮点数比较问题:使用浮点数作为循环变量可能导致精度问题------
cpp
for (float f = 0.0; f != 1.0; f += 0.1)
{
printf("%f ", f);
}
不推荐用浮点数作为循环变量。
4.4 修改循环变量问题:在循环体内修改循环变量可能导致意外行为------
cpp
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
i = 8; // 直接跳转
}
printf("%d ", i);
}
在循环体内修改循环变量可能会导致直接跳转的问题产生。
五、C语言循环的实际应用场景
这里我们直接展示代码,就不展开具体说明了。
(一)示例1:查找素数
cpp
#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:冒泡排序
cpp
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:用户菜单系统
cpp
#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)控制语句里的 break 和 continue 可以更灵活地控制循环流程。
往期回顾:
**结语:**本文内容到这里就结束了,大家不要忘了给博主"一键四连"哦!