程序阅读技巧
概念讲解
常用技巧
- 变量追踪法: 用表格记录每个变量的值
- 循环展开法: 写出前几次循环的结果
- 递归树法: 画出递归调用树
常见陷阱
| 陷阱 | 说明 |
|---|---|
| 自增自减 | i++ 和 ++i 的区别 |
| 短路求值 | && 和 || 的短路特性 |
| 整数溢出 | 超出范围回绕 |
| 边界条件 | 循环边界、数组下标 |
变量追踪法
1234int a = 1, b = 2;
a = a + b; // a=3, b=2
b = a - b; // a=3, b=1
a = a - b; // a=2, b=1| 步骤 | a | b |
|---|---|---|
| 初始 | 1 | 2 |
| 第1步 | 3 | 2 |
| 第2步 | 3 | 1 |
| 第3步 | 2 | 1 |
考点分析
初赛考查方式
- 程序阅读题: 手动模拟程序
- 选择题: 程序输出
常见考点
- 循环执行次数
- 递归调用过程
- 变量值变化
例题精讲
例题 1:循环追踪
题目: 以下代码输出什么?
12345int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
cout << sum;解答:
sum = 1+2+3+4+5 = 15
例题 2:递归追踪
题目: 以下代码输出什么?
12345int f(int n) {
if (n <= 1) return 1;
return n * f(n-1);
}
cout << f(4);解答:
f(4) = 4*f(3) = 4*3*f(2) = 4*3*2*f(1) = 4*3*2*1 = 24
练习题
- i++ 和 ++i 的区别是什么?
查看答案
| 表达式 | 先返回值 | 再自增 |
|---|---|---|
i++ |
是 | 否 |
++i |
否 | 是 |
示例:
123int i = 5;
int a = i++; // a=5, i=6
int b = ++i; // b=7, i=7- 短路求值是什么?
查看答案
短路求值是指逻辑运算符 && 和 || 的特殊行为:
&&:如果左边为 false,右边不执行||:如果左边为 true,右边不执行
示例:
123int a = 0;
if (a && (a++)) { ... } // a++ 不会执行
cout << a; // 输出 0- 如何手动模拟递归程序?
查看答案
使用递归树法:
- 画出递归调用树
- 从根节点开始,逐步展开
- 遇到终止条件时返回
- 从下往上计算返回值
示例(f(4)):
f(4)
├── 4 * f(3)
│ ├── 3 * f(2)
│ │ ├── 2 * f(1)
│ │ │ └── return 1
│ │ └── return 2
│ └── return 6
└── return 24易错点
⚠️ 注意:
- 注意自增自减的位置
- 注意循环边界
- 递归要有终止条件
- 注意整数溢出