- C编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境搭建
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔类型
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户自定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 向函数传递数组
- C - 从函数返回数组
- C - 变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 野指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点 (.) 运算符
- C - 枚举 (或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入 & 输出
- C - 文件 I/O (文件处理)
- C 预处理器
- C - 预处理器
- C - 指令
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C语言中的循环
包括 C 语言在内的许多编程语言都支持 **for** 关键字来构建循环。在 C 语言中,其他与循环相关的关键字有 **while** 和 **do-while**。与其他两种类型不同,**for** 循环被称为 **自动循环**,通常是程序员的首选。
**for 循环** 是一种入口控制循环,它执行语句直到给定条件满足。所有元素(初始化、测试条件和增量)都放在一起,使用 **for** 关键字在括号内形成一个 **for** 循环。
for 循环的语法
C 编程语言中 **for** 循环的语法如下:
for (init; condition; increment){ statement(s); }
for 循环的控制流程
以下是 "for" 循环的控制流程:
**init** 步骤首先执行,并且只执行一次。此步骤允许您声明和初始化任何循环控制 变量。您不需要在此处放置语句,只要出现分号即可。
接下来,评估条件。如果为真,则执行循环体。如果为假,则不执行循环体,控制跳转到 "for" 循环之后紧随其后的下一条语句。
在 "for" 循环体执行之后,控制流跳转回增量语句。此语句允许您更新任何循环控制变量。此语句可以留空,只要在条件之后出现分号即可。
现在再次评估条件。如果为真,则执行循环并重复该过程(循环体,然后增量步骤,然后再次条件)。条件变为假后,"for" 循环终止。
for 循环的流程图
以下流程图表示 **for** 循环的工作原理:
当开发人员预先知道要执行多少次迭代时,他们更喜欢使用 **for** 循环。可以将其视为 **while** 和 **do-while** 循环的简写,这些循环递增并测试循环变量。
**for** 循环可以采用不同的变体。让我们了解 **for** 循环在不同情况下的工作原理。
示例:基本 for 循环
这是 **for** 循环最基本的形式。请注意,括号内(在 **for** 关键字之前)的所有三个子句都是可选的。
#include <stdio.h> int main(){ int a; // for loop execution for(a = 1; a <= 5; a++){ printf("a: %d\n", a); } return 0; }
输出
运行代码并检查其输出:
a: 1 a: 2 a: 3 a: 4 a: 5
在循环语句之前初始化 for 循环计数器
初始化步骤可以放在 **for** 循环的头部上方。在这种情况下,必须通过放置分号来使 **init** 部分为空。
示例
#include <stdio.h> int main(){ int a = 1; // for loop execution for( ; a <= 5; a++){ printf("a: %d\n", a); } return 0; }
输出
您仍然会得到相同的输出:
a: 1 a: 2 a: 3 a: 4 a: 5
在 for 循环体内部更新循环计数器
您也可以在增量子句的位置放置一个空语句。但是,您需要在循环体内部放置增量语句,否则它将变成一个 无限循环。
示例
#include <stdio.h> int main(){ int a; // for loop execution for(a = 1; a <= 5; ){ printf("a: %d\n", a); a++; } return 0; }
输出
在这里,您也将获得与上一个示例相同的输出:
a: 1 a: 2 a: 3 a: 4 a: 5
在 for 循环体内部使用测试条件
您还可以省略括号中测试条件的第二个子句。在这种情况下,您需要使用 **break** 语句 终止循环,否则循环将无限运行。
示例
#include <stdio.h> int main(){ int a; // for loop execution for(a = 1; ; a++){ printf("a: %d\n", a); if(a == 5) break; } return 0; }
输出
执行此代码后,您将获得以下输出:
a: 1 a: 2 a: 3 a: 4 a: 5
使用多个计数器的 for 循环
在 **for** 语句中可能有多个变量的初始化和/或多个增量语句。但是,只能有一个测试条件。
示例
#include <stdio.h> int main(){ int a, b; // for loop execution for(a = 1, b = 1; a <= 5; a++, b++){ printf("a: %d b: %d a*b: %d\n", a, b, a*b); } return 0; }
输出
当您运行此代码时,它将产生以下输出:
a: 1 b: 1 a*b: 1 a: 2 b: 2 a*b: 4 a: 3 b: 3 a*b: 9 a: 4 b: 4 a*b: 16 a: 5 b: 5 a*b: 25
for 循环中的递减
您还可以形成一个递减的 **for** 循环。在这种情况下,循环变量的初始值大于其在测试条件中的值。for 语句中的最后一个子句使用递减运算符。
示例
以下程序按降序打印数字 5 到 1:
#include <stdio.h> int main(){ int a; // for loop execution for(a = 5; a >= 1; a--){ printf("a: %d\n", a); } return 0; }
输出
运行代码并检查其输出:
a: 5 a: 4 a: 3 a: 2 a: 1
使用 for 循环遍历数组
**for 循环** 非常适合一次遍历数组的一个元素。请注意,数组中的每个元素都具有从 "0" 开始递增的索引。
示例
#include <stdio.h> int main(){ int i; int arr[] = {10, 20, 30, 40, 50}; // for loop execution for(i = 0; i < 5; i++){ printf("a[%d]: %d\n", i, arr[i]); } return 0; }
输出
当您运行此代码时,它将产生以下输出:
a[0]: 10 a[1]: 20 a[2]: 30 a[3]: 40 a[4]: 50
示例:使用 for 循环计算数组元素的和
以下程序计算给定数组中所有整数的平均值。
#include <stdio.h> int main(){ int i; int arr[] = {10, 20, 30, 40, 50}; int sum = 0; float avg; // for loop execution for(i=0; i<5; i++){ sum += arr[i]; } avg = (float)sum / 5; printf ("Average = %f", avg); return 0; }
输出
运行代码并检查其输出:
Average = 30.000000
示例:使用 for 循环计算阶乘
以下代码使用 **for** 循环计算数字的阶乘值。请注意,数字的阶乘是 1 到给定数字之间所有整数的乘积。阶乘在数学上用以下公式表示:
x! = 1 * 2 * . . . * x
以下是计算阶乘的代码:
#include <stdio.h> int main(){ int i, x = 5; int fact = 1; // for loop execution for(i=1; i<= x; i++){ fact *= i; } printf("%d != %d", x, fact); return 0; }
输出
当您运行此代码时,它将产生以下输出:
5! = 120
当重复次数已知时,for 循环非常适合。但是,循环行为可以通过 **for** 循环体内的 **break** 和 **continue** 关键字 来控制。嵌套 **for** 循环也经常用于处理二维 数组。