title:
id: 20260314144223
created: 2026-03-14
blog_tags:
aliases:
分类目录:
发布平台: blog
发布日期:
cover:
1. while循环:入口条件循环的基础
while循环是使用入口条件的有条件循环。“有条件”指语句部分的执行取决于测试表达式描述的条件。
语法结构:
while (expression)
statement
⚠️注意:紧跟在while后面的statement才是循环体,它可以是简单语句,也可以是复合语句。
2. 构建循环条件:关系运算符与真值
为了构建有效的循环测试条件,我们需要理解关系运算符和C语言中的真值概念。
关系运算符
循环条件通常需要使用关系运算符来比较数值。以下是C语言中的关系运算符:
| 运算符 | 意义 |
|---|---|
< | 小于 |
<= | 小于或等于 |
| == | 等于 |
>= | 大于或等于 |
> | 大于 |
!= | 不等于 |
⚠️注意:
- 优先级:关系运算符的优先级高于算术运算符。
在关系运算符内部,<、<=、>、>=的优先级高于==和!=。所有关系运算符的结合性为从左到右。 - 浮点数比较:通常使用
<和>。
应避免使用==和!=直接比较浮点数,因为浮点数的舍入误差可能导致逻辑上相等的两数不相等。
2.2 真值与_Bool类型
C语言对所有表达式的真假判断遵循一个简单规则:
- 假值:仅为
0。 - 真值:所有非零值。
传统上,C语言用int型变量表示布尔值(真/假)。C99标准引入了_Bool类型来明确表示布尔变量。_Bool类型的变量只能存储1(真)或0(假)。如果将一个非零值赋给_Bool变量,它会被自动转换为1。
3. 从while到for:两种循环模式
根据循环次数是否明确,循环可分为两类:
- 不确定循环(indefinitializee loop):在测试表达式为假之前,无法预知循环执行次数。
- 计数循环(counting loop):在循环开始前,就已明确知道需要执行的次数。
使用while循环实现计数循环通常需要三个明确的步骤:1) 初始化计数器;2) 比较计数器;3) 更新计数器。
for循环的引入,正是为了将计数循环的三个步骤(初始化、测试、更新)优雅地整合在一起,使代码更紧凑、意图更清晰。
for循环语法:
for (initialize; expression; update)
statement
4. for循环的灵活性进阶
for循环的语法设计赋予了它极大的灵活性,远不止简单的计数。循环头中的三个表达式可以有多种变化。
4.1 多样的更新与控制方式
- 反向计数:使用递减运算符(如
i--)更新计数器。 - 步长控制:让计数器一次增加2、10或其他数值。
- 字符计数:用字符变量作为计数器(如
ch = 'a'; ch <= 'z'; ch++)。 - 复合条件:测试表达式不限于迭代次数,可包含其他任意条件。
- 几何增长:更新表达式可使计数器以倍数增长(如
i *= 2)。 - 任意合法表达式:第三个表达式(
update)可以是任何合法的C语言表达式。 - 表达式省略:可以省略一个或多个表达式,但必须保留分号。如果省略第二个表达式(
expression),它会被视为永远为真,因此必须在循环体内提供终止循环的机制(如break)。 - 初始化中的操作:第一个表达式不一定是赋值,也可以是函数调用(如
printf(...))。 - 循环体影响循环头:循环体内的语句可以改变循环头中表达式的变量值。
4.2 扩展利器:逗号运算符
为了在for循环头中执行多个初始化或更新操作,C语言提供了逗号运算符。
for (initialize_A, initialize_B; expression; update_A, update_B)
statement
逗号运算符特性:
- 顺序求值:保证被它分隔的表达式从左到右依次执行。
- 整体值:整个逗号表达式的值是最右边表达式的值。
逗号运算符也可用于for循环之外的场合。
5. 简洁的赋值:复合赋值运算符
为了让变量自身的运算赋值更简洁,C语言提供了一系列复合赋值运算符。
| 运算符 | 示例 | 等价于 |
|---|---|---|
+= | num += 20; | num = num + 20; |
-= | eggs -= 10; | eggs = eggs - 10; |
*= | add *= 3; | add = add * 3; |
/= | time /= 2; | time = time / 2; |
%= | red %= 3; | red = red % 3; |
用法:变量 运算符 表达式。它们在循环的更新部分尤为常用。
6. 出口条件循环:do while
与while和for这类入口条件循环(先检查条件,再决定是否执行循环体)不同,C语言还提供了出口条件循环——do while。
语法结构:
do
statement
while (expression);
do while循环先执行一次循环体,然后再检查测试条件。因此,它至少会执行循环体一次。在需要确保某个操作至少执行一次的场景下非常有用。
7. 复杂数据操作:嵌套循环与数组简介
掌握了基本循环后,我们可以处理更复杂的数据结构。
7.1 嵌套循环
在一个循环内部包含另一个完整的循环,称为嵌套循环。它常用于处理二维数据,例如按行和列输出表格、矩阵运算等。
7.2 数组简介
数组是一种用于存储多个相同类型数据的数据结构。这些数据在内存中顺序排列,并通过一个数组名和整数下标(或索引)来访问。
例如,scores[0]访问数组scores的第一个元素。
❗ 重要警告:C语言编译器不会检查数组下标的有效性。访问数组范围之外的内存(如scores[100],而数组只有10个元素)会导致未定义行为,可能引发程序崩溃或安全漏洞,程序员必须自行确保下标合法。