B75
程序调试:断点、单步与质数案例
引入
章前总览 调试(debug)是为了抓住逻辑错误:一步步跑程序、看变量。也常用来读懂别人的写法。
本节内容:
- 何时需要调试
- 断点与单步的通用步骤
- 案例:质数判定里的同名变量陷阱
- 小知识:bug 与 debug
1 调试目的与步骤
样例跑不通、输出错、或提交 WA/RTE/TLE 时,都可以调试。
通用四步(各 IDE 类似)
- 设断点:执行到该行暂停;若断点前有 cin,会先等你输入。
- 进入调试状态(如 Dev-C++ 的 F5)。
- 单步执行,对照预期步骤;在监视窗口看变量。
- 遇函数调用:可步过整函数,或步入函数内部再返回。
2 案例:有逻辑错误的质数判定
输入 n≥2,质数输出 yes,否则 no。下面程序能编译,但输入 13 会错成 no。
有 bug 的代码
#include <iostream>
using namespace std;
int main() {
int n; cin >> n;
int i = 0;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0)
break;
}
if (i * i <= n) cout << "no" << endl;
else cout << "yes" << endl;
return 0;
}
- 测试:12 → no(对);13 → no(错,应为 yes)。
根因:两个叫 i 的变量
- for 里的
int i作用域仅限循环内。 - 循环后判断用的是外面那个
i(一直是 0)。 - 0*0≤13 恒真 → 总输出 no。
- 修复:去掉 for 里的
int,只用外层 i,在 for 头里初始化。
修好后
int i = 0;
for (i = 2; i * i <= n; i++) {
if (n % i == 0) break;
}
if (i * i <= n) cout << "no" << endl;
else cout << "yes" << endl;
3 小知识:bug 与 debug
bug 原指虫子;早期计算机因虫子钻进真空管而失灵,后人用 bug 称呼隐藏缺陷。
注意
- bug 一般指逻辑错误:能运行,但特定情况结果错甚至崩溃。
- 编译错误不算 bug——程序根本跑不起来。
- 发现并修好的过程叫 debug(调试)。
- 例:
if(a=1)本意相等却写成赋值,就是典型 bug。
小结
调试时盯紧:
断点 → 输入 → 单步 → 看变量
同名变量 / 作用域 是一级常见坑
✓
里程碑达成:
下一节做第15章基础知识自测。