C5 循环

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. 从whilefor:两种循环模式

根据循环次数是否明确,循环可分为两类:

  • 不确定循环indefinitializee loop):在测试表达式为假之前,无法预知循环执行次数。
  • 计数循环counting loop):在循环开始前,就已明确知道需要执行的次数。

使用while循环实现计数循环通常需要三个明确的步骤:1) 初始化计数器;2) 比较计数器;3) 更新计数器。

for循环的引入,正是为了将计数循环的三个步骤(初始化、测试、更新)优雅地整合在一起,使代码更紧凑、意图更清晰。

for循环语法:

for (initialize; expression; update)
    statement

4. for循环的灵活性进阶

for循环的语法设计赋予了它极大的灵活性,远不止简单的计数。循环头中的三个表达式可以有多种变化。

4.1 多样的更新与控制方式

  1. 反向计数:使用递减运算符(如i--)更新计数器。
  2. 步长控制:让计数器一次增加2、10或其他数值。
  3. 字符计数:用字符变量作为计数器(如ch = 'a'; ch <= 'z'; ch++)。
  4. 复合条件:测试表达式不限于迭代次数,可包含其他任意条件。
  5. 几何增长:更新表达式可使计数器以倍数增长(如i *= 2)。
  6. 任意合法表达式:第三个表达式(update)可以是任何合法的C语言表达式。
  7. 表达式省略:可以省略一个或多个表达式,但必须保留分号。如果省略第二个表达式(expression),它会被视为永远为真,因此必须在循环体内提供终止循环的机制(如break)。
  8. 初始化中的操作:第一个表达式不一定是赋值,也可以是函数调用(如printf(...))。
  9. 循环体影响循环头:循环体内的语句可以改变循环头中表达式的变量值。

4.2 扩展利器:逗号运算符

为了在for循环头中执行多个初始化或更新操作,C语言提供了逗号运算符

for (initialize_A, initialize_B; expression; update_A, update_B)
    statement

逗号运算符特性

  1. 顺序求值:保证被它分隔的表达式从左到右依次执行。
  2. 整体值:整个逗号表达式的值是最右边表达式的值。

逗号运算符也可用于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

whilefor这类入口条件循环(先检查条件,再决定是否执行循环体)不同,C语言还提供了出口条件循环——do while

语法结构:

do
    statement
while (expression);

do while循环先执行一次循环体,然后再检查测试条件。因此,它至少会执行循环体一次。在需要确保某个操作至少执行一次的场景下非常有用。

7. 复杂数据操作:嵌套循环与数组简介

掌握了基本循环后,我们可以处理更复杂的数据结构。

7.1 嵌套循环

在一个循环内部包含另一个完整的循环,称为嵌套循环。它常用于处理二维数据,例如按行和列输出表格、矩阵运算等。

7.2 数组简介

数组是一种用于存储多个相同类型数据的数据结构。这些数据在内存中顺序排列,并通过一个数组名和整数下标(或索引)来访问。

例如,scores[0]访问数组scores的第一个元素。

重要警告:C语言编译器不会检查数组下标的有效性。访问数组范围之外的内存(如scores[100],而数组只有10个元素)会导致未定义行为,可能引发程序崩溃或安全漏洞,程序员必须自行确保下标合法。