程序阅读技巧

概念讲解

常用技巧

  1. 变量追踪法: 用表格记录每个变量的值
  2. 循环展开法: 写出前几次循环的结果
  3. 递归树法: 画出递归调用树

常见陷阱

陷阱 说明
自增自减 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. 程序阅读题: 手动模拟程序
  2. 选择题: 程序输出

常见考点

  • 循环执行次数
  • 递归调用过程
  • 变量值变化

例题精讲

例题 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

练习题

  1. i++ 和 ++i 的区别是什么?
查看答案
表达式 先返回值 再自增
i++ 是 否
++i 否 是

示例:

123int i = 5;
int a = i++;  // a=5, i=6
int b = ++i;  // b=7, i=7
  1. 短路求值是什么?
查看答案

短路求值是指逻辑运算符 && 和 || 的特殊行为:

  • &&:如果左边为 false,右边不执行
  • ||:如果左边为 true,右边不执行

示例:

123int a = 0;
if (a && (a++)) { ... }  // a++ 不会执行
cout << a;  // 输出 0
  1. 如何手动模拟递归程序?
查看答案

使用递归树法:

  1. 画出递归调用树
  2. 从根节点开始,逐步展开
  3. 遇到终止条件时返回
  4. 从下往上计算返回值

示例(f(4)):

f(4)
├── 4 * f(3)
│   ├── 3 * f(2)
│   │   ├── 2 * f(1)
│   │   │   └── return 1
│   │   └── return 2
│   └── return 6
└── return 24

易错点

⚠️ 注意:

  1. 注意自增自减的位置
  2. 注意循环边界
  3. 递归要有终止条件
  4. 注意整数溢出