CAPL 编程系列教程的第十四期内容,主要讲解 CAPL 中的另一种重要的循环结构:for 循环语句。
CAPL 编程系列教程 - 第十四期:循环结构 (第二部分) - for 循环
一、 课程回顾与本期目标
- 回顾: 上一期学习了
while和do-while循环结构。 - 本期目标: 学习 CAPL 中最常用的循环结构
for语句,理解其语法、执行流程、与while循环的对比以及一些特殊用法。注:CAPL 语言的for循环不支持逗号运算符
二、 for 循环语句的语法与执行流程
- 基本语法:
Code snippet
for (initialization; condition; update) { // Loop body statements }
- 关键字:
for。 - 括号内的三部分 (用分号
;分隔):initialization(初始化):- 在循环第一次开始之前执行,且仅执行一次。
- 通常用于声明并/或初始化循环控制变量(如
int i = 0;或i = 0;)。
condition(条件):- 每次循环迭代开始之前进行判断。
- 决定是否执行或继续执行循环体。
- 求值规则同
if/while:非零即真。
update(更新):- 在每次循环体执行之后,下一次条件判断之前执行。
- 通常用于修改循环控制变量的值(如
i++,i += 2,j--)。
- 循环体 (Loop Body):
- 花括号
{}内的语句块。 - 当
condition为真时执行。 - 如果只有一条语句,花括号可省略(但不推荐)。
- 花括号
- 执行顺序:
- ① 执行
initialization(仅一次)。 - ② 判断
condition。 - ③ 如果
condition为真,执行循环体 (Loop Body)。 - ④ 执行
update。 - ⑤ 返回步骤 ②,重复判断
condition。 - ⑥ 如果
condition为假,循环结束,跳出for循环,执行后续语句。
- ① 执行
三、 for 循环示例
- 打印三次 "I love you":
Code snippet
int i; // 可以在循环外声明 for (i = 0; i < 3; i++) { // 初始化; 条件; 更新 write("I love you %d", i); // 输出 0, 1, 2 } - 计算 1 到 100 的和:
Code snippet
int i; int total = 0; for (i = 1; i <= 100; i++) { total += i; // 循环体 } write("总和为: %d", total); // 输出 5050
- 简洁性: 相对于
while循环,for循环将初始化、条件判断和更新这三个与循环控制密切相关的部分集中写在了一起,结构更紧凑,代码通常更简洁易读,特别适用于循环次数已知或有明确范围的情况。
四、 for 循环的灵活性与特殊用法
- 省略括号中的部分:
for循环括号内的三个部分(初始化、条件、更新)都可以省略,但分号;必须保留。- 省略初始化: 如果循环变量在
for之前已经初始化,可以省略第一部分。Code snippetint i = 1; int total = 0; for (; i <= 100; i++) { // 省略初始化 total += i; } - 省略更新: 如果更新逻辑放在循环体内,可以省略第三部分。
Code snippet
int i = 1; int total = 0; for (; i <= 100; ) { // 省略更新 total += i; i++; // 在循环体内更新 } - 省略条件:
- 如果省略条件部分,条件永远被视为真 (True)。
- 这会创建一个无限循环 (死循环),除非在循环体内使用
break或其他方式(如return,exit)跳出。 - 示例 (需配合
break): (虽然语法允许,但不推荐这样写,不如直接把条件写在Code snippetint i = 1; int total = 0; for (;;){ // 无限循环 total += i; if (i == 100) { // 在循环体内判断退出条件 break; // 达到条件后跳出 } i++; }for的第二部分清晰)。
- 全部省略:
for (;;)是一个标准的无限循环写法,依赖循环体内的break退出。
- 省略初始化: 如果循环变量在
- 循环主体省略花括号: 当循环体只有一条语句时,可以省略花括号
{},但不推荐。Code snippetfor (i = 1; i <= 100; i++) total += i; // 只有这一句是循环体 - 循环控制关键字:
break: 同样可以在for循环体中使用,用于立即跳出整个for循环。continue: 同样可以在for循环体中使用,用于跳过当前迭代中continue之后的语句,直接进入update部分,然后进行下一次条件判断。- 示例 (判断质数): 使用
for循环重写判断质数的逻辑,利用break提前退出。Code snippetint number = 121; int i; for (i = 2; i < number; i++) { // i 从 2 循环到 number-1 if (number % i == 0) { write("%d 不是质数, 能被 %d 整除", number, i); break; // 找到因子,退出 for 循环 } } if (i == number) { // 判断循环是 break 退出还是正常结束 write("%d 是质数", number); }
五、 CAPL for 循环与 C 语言 for 循环的区别
- 逗号运算符:
- C 语言的
for循环支持在初始化部分和更新部分使用逗号运算符,来执行多个表达式(例如,同时初始化或更新多个变量:for (i=1, j=5; i<=5; i++, j--))。 - CAPL 语言的
for循环不支持逗号运算符。在初始化和更新部分,只能包含单个表达式。
- C 语言的
- 解决方法: 如果需要在 CAPL 的
for循环中实现类似 C 语言逗号运算符的效果(如同时更新多个变量),需要将额外的更新操作移到循环体内部去完成。Code snippet// CAPL 实现类似 C 的 for (i=1, j=5; i<=5; i++, j--) int i, j = 5; // j 需要在循环外初始化 for (i = 1; i <= 5; i++) { write("%d + %d = %d", i, j, i + j); j--; // 在循环体内更新 j }
六、 总结与后续
- 本期学习了 CAPL 中常用的
for循环结构,它将循环控制的三个关键部分(初始化、条件、更新)集中管理,通常比while更简洁。 - 掌握了
for循环的执行流程、省略用法、break/continue的应用,并特别注意了其与 C 语言在逗号运算符上的区别。 - 至此,CAPL 的主要循环结构 (
while,do-while,for) 已讲解完毕。后续将学习 CAPL 的其他高级特性。