第五章——循环结构 第二节——For语句及其延伸

第五章——循环结构 第二节——For语句及其延伸

亓翎_Re-Tikara Lv5

🌟 for循环:循环世界的「时间管理大师」

1.1 基本语法与执行逻辑

1
2
3
4
for([变量初值];[循环继续条件];[循环变量增值]) 
{
// 循环体语句组(条件为真时反复执行)
}

执行流程图
for.png

(1)求解“变量赋初值”表达式。

(2)求解“循环继续条件”表达式。如果其值非0,执行(3);否则,转至(4)。

(3)执行循环体语句组,并求解“循环变量增值”表达式,然后转向(2)。

(4)执行for语句的下一条语句。

  for循环等价于

1
2
3
4
5
6
表达式1;
while(表达式2
{
循环体;
表达式3
}

1.2 案例:快递分拣员的终极考验

场景:快递员需要分拣1到100号包裹,但遇到编号是质数的包裹时必须单独检查。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <math.h>
int main()
{
for(int i = 2; i <= 100; i++)
{
int is_prime = 1; // 标记是否为质数
for(int j = 2; j <= sqrt(i); j++)
{
if(i % j == 0)
{
is_prime = 0;
break; // 非质数直接跳出内层循环
}
}
if(is_prime)
printf("质数包裹:%d\n", i);
}
return 0;
}

关键点

  • 双重循环:外层控制包裹编号,内层判断是否为质数。
  • break跳转:发现非质数立即跳出内层循环,提升效率。

🚀 for循环的高级用法:多变量控制的艺术*

2.1 案例:植物大战僵尸的「循环战术」

场景:僵尸按行进攻,每行有5个僵尸,需逐个消灭并统计剩余僵尸数量。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
for(int row = 1, zombies = 5; row <= 3; row++, zombies = 5) {
printf("第%d波进攻!\n", row);
for(; zombies > 0; zombies--) {
printf("击倒僵尸(剩余:%d)\n", zombies - 1);
}
printf("本波结束,刷新战场...\n\n");
}
return 0;
}

输出示例

1
2
3
4
5
第1波进攻!  
击倒僵尸(剩余:4)
击倒僵尸(剩余:3)
...
本波结束,刷新战场...

2.2 案例:时间沙漏的逆向计时

场景:模拟火箭发射倒计时(从10到1),并在结束后输出“发射成功!”。

1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
for(int t = 10; t >= 1; t--) {
printf("倒计时:%d秒\n", t);
}
printf("🚀 发射成功!\n");
return 0;
}

⚠️ 常见错误与避坑指南

错误类型 错误代码 修复方法
死循环 for(;;) { ... } 添加 break 或更新条件变量
变量作用域错误 for(int i=0; i<10; i++) 避免在循环外使用循环变量
表达式逻辑错误 for(i=0; i=10; i++) 使用比较运算符而非赋值

🧠 真题实战:理解for循环的本质

4.1 真题1:变量作用域陷阱

题目:以下代码输出什么?

1
2
3
4
5
6
#include <stdio.h>
int main() {
int i;
for(i = 0; i < 5; i++);
printf("i=%d", i);
}

解析

  • for后的分号导致循环体为空,i从0递增到5后终止循环。
  • printf输出i=5

4.2 真题2:表达式省略的陷阱

题目:以下代码输出什么?

1
2
3
4
5
6
7
#include <stdio.h>
int main() {
int i = 0;
for(; i < 3;) {
printf("%d ", i++);
}
}

解析

  • 初始化和更新表达式被省略,需在循环体内手动更新i
  • 输出0 1 2

🎯 总结:for循环的哲学

  • 选for:当循环次数明确(如遍历数组、固定次数操作)或需要结构化控制时。
  • 适用场景:已知边界条件、多变量控制、图形生成、算法实现(如排序、查找)。

🎯 记忆口诀
「次数明确用for,结构紧凑控变量」
就像人生选择——精确计划用for,动态调整用其他结构!


几条算是比较正式的说明

  1. 当循环体语句组仅由一条语句构成时,可以不使用复合语句形式(即可以不使用{ }
1
2
3
4
5
6
7
8
9
10
11
12

#include<stdio.h>

main()
{ char c;

for( ; (c=getchar())!='\n' ; )

printf("%c ",c);
//此处可以不用{}围起来,但是,我喜欢!!围起来方便认!!
// 不围起来有时候会认错结构
}
  1. “循环变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式(如逗号表达式)。
1
2
3
4
5
6
7
8
9
10
例:
main()
{
int i,j,k;
for( i = 0 , j = 100 ; i <= j ; i++ , j--)
{
k=i+j;
printf("%d + %d = %d \n" , i , j , k);
}
}
  1. “循环继续条件”部分是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式。

1
2
3
4
5
6
7
8
9
10
例:
#include <stdio.h>

main()
{
int i , c;
for( i = 0 ; ( c = getchar() ) != '\n' ; i += 3 )

printf("%c ", i + c );
}

几个考点

  1. 变量赋初值表达式可以省略,但后面的分号不能省略,此时应在for语句之前给循环变量赋初值。
  2. 如果省略循环继续条件,表示条件始终为真,循环将无终止。(又进入了死循环啊喂)
  3. 如果省略变量赋初值表达式和循环变量增值表达式,此时完全等价于while语句。
  4. for语句的循环语句可以是空语句,用来实现延时,但是后面的分号不能省略。
  • 标题: 第五章——循环结构 第二节——For语句及其延伸
  • 作者: 亓翎_Re-Tikara
  • 创建于 : 2026-02-07 02:21:28
  • 更新于 : 2026-02-10 02:48:46
  • 链接: https://re-tikara.fun/Blog/posts/1b6c06df/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。